代码之家  ›  专栏  ›  技术社区  ›  Kimvais

如何正确地将QApplication子类化?

  •  4
  • Kimvais  · 技术社区  · 15 年前

    我是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子类中时,这一切都工作得很好。。。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Greg S    15 年前

    尝试添加 QtGui.qApp = self 给你的 __init__ 方法(或尝试使用 QApplication.instance() qApp ).

    我希望这有帮助。

        2
  •  2
  •   Nova    12 年前

    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__() 主()

    ...
    
    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