【问题标题】:How do I subclass QApplication properly?如何正确继承 QApplication?
【发布时间】:2011-04-19 00:02:57
【问题描述】:

我是 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 -子类中时,这一切都可以正常工作...

【问题讨论】:

    标签: python qt4 pyqt pyqt4


    【解决方案1】:

    尝试将QtGui.qApp = self 添加到您的__init__ 方法(或尝试使用QApplication.instance() 而不是qApp)。

    希望对你有帮助。

    【讨论】:

    • 前一种方法不起作用,QApplication.instance() 成功了。谢谢!
    【解决方案2】:

    纯面向对象的方法是:

    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

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2013-03-15
      相关资源
      最近更新 更多