如何正确地继承QApplication?
我刚开始学习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
。
希望这能帮到你。