Как правильно создать подкласс QApplication?

Я новичок в PyQt4 (и QT в целом), и столкнулся с проблемой,

Я создал подкласс QApplication (чтобы иметь глобальные данные и функции, которые действительно являются глобальными для приложения):

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

    def bar(self,x):
        do_something()

Когда я пытаюсь добавить слот в свое главное окно, например:

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

Я получаю сообщение об ошибке: AttributeError: bar

Что я делаю неправильно? Или я должен сделать то, что я хочу, глобальным, global stuff вместо атрибутов и методов подкласса QApplication? (или что-то другое, если да, то что?)

Примечание: все это работало нормально, когда "глобальные" методы и атрибуты находились в моем подклассе QMainWindow...


person Kimvais    schedule 29.09.2010    source источник


Ответы (2)


Попробуйте добавить QtGui.qApp = self к вашему методу __init__ (или попробуйте использовать QApplication.instance() вместо qApp).

Надеюсь, это поможет.

person Greg S    schedule 29.09.2010
comment
Прежний подход не сработал, QApplication.instance() сделал свое дело. Спасибо! - person Kimvais; 30.09.2010

Чисто объектно-ориентированный подход:

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

Как обсуждалось в книге Бертрана Мейера «Объектно-ориентированное проектирование программного обеспечения», объектно-ориентированная программа создает экземпляр одного объекта, объекта приложения. Использование процедуры main() является пережитком процедурного программирования в стиле C.

Также может произойти сбой следующего кода: Другими словами, MyApp.__init__() должен войти в основной цикл обработки событий, а не main().

...

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

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

См. другие примеры: http://en.wikibooks.org/wiki/Python_Programming/PyQt4

person bootchk    schedule 28.09.2012