Как правильно создать подкласс QApplication? - PullRequest
4 голосов
/ 29 сентября 2010

Я новичок в 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 -subclass ...

Ответы [ 2 ]

3 голосов
/ 30 сентября 2010

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

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

2 голосов
/ 28 сентября 2012

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

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

Как обсуждалось в "Построении объектно-ориентированного программного обеспечения" Бертрана Мейера, программа OO создает один объект, объект приложения.Использование процедуры 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

...