如何正确地继承QApplication?

7 投票
2 回答
4078 浏览
提问于 2025-04-16 04:46

我刚开始学习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 个回答

4

一种纯粹的面向对象的方法是:

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

3

试着在你的 __init__ 方法里加上 QtGui.qApp = self,或者可以用 QApplication.instance() 来代替 qApp

希望这能帮到你。

撰写回答