2010-09-29 5 views
4

Je suis un débutant avec PyQt4 (et QT tout à fait), et je suis face à un problème,Comment sous-classer QApplication correctement?

Je sous-classé QApplication (pour avoir des données globales et les fonctions qui sont vraiment globale à l'application):

class App(QApplication): 
    def __init__(self): 
     QApplication.__init__(self) 
     self.foo = None 

    def bar(self,x): 
     do_something() 

Lorsque je tente d'ajouter un emplacement à ma fenêtre principale comme:

self.connect(bar, SIGNAL('triggered()'), qApp.bar)

Je reçois une erreur: AttributeError: bar

Qu'est-ce que je fais mal? Ou devrais-je faire les choses que je veux global, global stuff à la place des attributs et des méthodes de la sous-classe QApplication? (Ou quelque chose d'autre, si oui, quoi?)

Note: tout cela a bien fonctionné lorsque les méthodes et les attributs « globaux » étaient dans ma QMainWindow -subclass ...

Répondre

3

Essayez d'ajouter QtGui.qApp = self à votre __init__ méthode (ou essayez d'utiliser QApplication.instance() au lieu de qApp).

J'espère que cela aide.

+1

L'ancienne approche ne fonctionnait pas, 'QApplication.instance()' a fait l'affaire. Merci! – Kimvais

1

Une approche orientée objet pur est:

from PySide.QtCore import * 
from PySide.QtGui import * 
import sys 

....import your classes ... 

''' 
classes needing 'global' application attributes use for example: 
QCoreApplication.instance().mainWindow 
''' 

class MyApp(QApplication): 

    def __init__(self, args): 
    super(MyApp, self).__init__(args) 
    self.mainWindow = MainWindow() # 'global' 
    ... 
    self.exec_() # enter event loop 

app = MyApp(sys.argv) # instantiate app object 

Comme indiqué dans le « logiciel orienté objet construction » de Bertrand Meyer, un programme OO instancie un objet, l'objet d'application. L'utilisation d'une procédure main() est une relique de la programmation procédurale de style C.

En outre, le code suivant peut se bloquer: En d'autres termes, MyApp.__init__() doit entrer dans la boucle d'événement principal, pas main().

... 

def main(args): 
    app = MyApp(args) 
    ... 
    sys.exit(app.exec_()) # Qt event loop 

if __name__ == "__main__": 
    main(sys.argv) 

Voir d'autres exemples: http://en.wikibooks.org/wiki/Python_Programming/PyQt4

Questions connexes