我正在开发一个复杂的基于Qt的Python应用程序。它雇佣了一个PySide.QtCore.QTimer.singleShot(int,slot)计时器延迟线程中插槽的执行,我对这个计时器的工作方式感到困惑。在
这是一个MWE。本例使用了QThread子类化并重新实现run()的方法。我把以下内容放在一个名为计时器.py公司名称:
import PySide
import time
class SubClassThread(PySide.QtCore.QThread):
def run(self):
print('called SubClassThread.run()')
self.delayed_print()
def delayed_print(self):
print('called SubClassThread.delayed_print()')
PySide.QtCore.QTimer.singleShot(1000, self.print_things)
time.sleep(2)
print('end of delayed_print()')
def print_things(self):
print('called print_things')
我用来测试这个的代码(称之为test.py
):
python test.py
的输出:
Test: QThread subclassing
called SubClassThread.run()
called SubClassThread.delayed_print()
end of delayed_print()
奇怪的是单发QTimer似乎从未被调用(输出中没有called print_things()
!)我将非常感谢你能澄清这一点。我觉得我缺少了Qt框架的一些简单成分。请原谅我-我确实花了几个小时寻找答案。在
QThread.run()
的默认实现调用QThread.exec()
,这将启动线程自己的事件循环。QTimer
需要一个正在运行的事件循环,它的timeout()
信号将在启动它的线程中发出。您的run()
的实现不会启动事件循环,因此计时器将不执行任何操作。在正如@ekhurvo所指出的,我对run()的重新实现未能调用exec\uu()。这是主要问题。我花了一分钟的时间找到了exec_u()调用的位置,以及如何在线程工作完成后正确地退出()线程。这是有效的代码。在
类定义,
timertester.py
:应用程序,
^{pr2}$test.py
:最后,
python test.py
的输出:关于QTimers,我学到了:对delayed_print()的调用在计时器仍在运行时完成,通过将quit()放入计时器调用的方法中,应用程序在调用该方法之前不会退出。在
如果有任何关于这段代码的评论,或者关于这个简单应用程序的Qt方面的评论,请发布!我在为初学者找到可访问的PyQt/PySide信息时遇到了一些困难。在
相关问题 更多 >
编程相关推荐