如何正确地将QApplication子类化?

时间:2010-09-29 18:55:10

标签: python qt4 pyqt pyqt4

我是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 个答案:

答案 0 :(得分:3)

尝试在QtGui.qApp = self方法中添加__init__(或尝试使用QApplication.instance()代替qApp)。

我希望有所帮助。

答案 1 :(得分:1)

纯面向对象的方法是:

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

正如Bertrand Meyer的“面向对象的软件构造”中所讨论的,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