4

我想执行一个只能在QApplication显示 my 时调用的方法,即当它进入其主事件循环时exec_()。我是 Qt4 的新手(使用 PyQt4):我希望有一个类似on_start()的回调,但没有找到。我需要创建一个线程还是一个计时器?或者 API 中是否已经包含一些回调?

4

3 回答 3

5

您可以为此使用单次计时器,如以下简单脚本中所示:

import sys
from PyQt4 import QtGui, QtCore

app = QtGui.QApplication(sys.argv)

def on_start():
    print(' in event loop!')
    print(' telling app to exit ...')
    app.exit(123)

QtCore.QTimer.singleShot(0, on_start)
print('About to enter event loop')
rc = app.exec_()
print('All done - returned %d' % rc)

当你运行它时,你应该看到

About to enter event loop
 in event loop!
 telling app to exit ...
All done - returned 123
于 2011-06-02T19:19:17.253 回答
0

我以前没有使用过 Qt,所以我可能错了,但我想你可以将你的on_start()方法绑定到ApplicationActivate事件,并从你的方法内部设置一个标志,on_start()这样代码只会在第一次运行而不是任何其他时间ApplicationActivate在程序执行期间触发事件。

另一方面,如果该on_start()方法将被多个线程调用,您可能希望使用特定于线程的标志。我自己没有做太多的多线程,所以我不确定具体的细节是什么,或者它有多简单/复杂。

于 2011-06-02T18:47:06.583 回答
0

现在我选择使用QThread这种方式:

class MyThread(QtCore.QThread):
    def run(self):
    ''' reinplemented from parent '''
        # make thread sleep to make sure
        # QApplication is running before doing something
        self.sleep(2)
        do_something()

class MyWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.attr = 'foo'
        self.thread = MyThread(self)
        self.thread.start()

def main():
    app = QtGui.QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())

它适用于我的目的,因为我的(真实)代码中的线程实际上在 X 显示中查找应用程序窗口,并且会尝试这样做直到找到它。但除此之外,这不是解决问题的优雅方式。QApplication如果进入事件循环时有一个信号会更好。JAB 提出了Qt.ApplicationActivate但它似乎不是由 发出的QApplication,即使它是,因为MyWidget()没有实例化为 的子级QApplication,我不知道如何将信号从 传递appw

在接受我的答案作为选择的解决方案之前,我将等待更好的答案(如果有的话)。

于 2011-06-02T20:15:07.543 回答