我是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中时,这一切都运行正常......
答案 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