如何制作PySide.QtCore.QTimer.singleShot调用其超时方法

2024-07-03 02:05:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个复杂的基于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):

^{pr2}$

python test.py的输出:

Test: QThread subclassing
called SubClassThread.run()
called SubClassThread.delayed_print()
end of delayed_print()

奇怪的是单发QTimer似乎从未被调用(输出中没有called print_things()!)我将非常感谢你能澄清这一点。我觉得我缺少了Qt框架的一些简单成分。请原谅我-我确实花了几个小时寻找答案。在


Tags: runpyselfdefqt计时器pysideprint
2条回答

QThread.run()的默认实现调用QThread.exec(),这将启动线程自己的事件循环。QTimer需要一个正在运行的事件循环,它的timeout()信号将在启动它的线程中发出。您的run()的实现不会启动事件循环,因此计时器将不执行任何操作。在

正如@ekhurvo所指出的,我对run()的重新实现未能调用exec\uu()。这是主要问题。我花了一分钟的时间找到了exec_u()调用的位置,以及如何在线程工作完成后正确地退出()线程。这是有效的代码。在

类定义,timertester.py

import PySide

class SubClassThread(PySide.QtCore.QThread):

        def __init__(self,parent=None):
                print('called SubClassThread.__init__()')
                super(SubClassThread,self).__init__(parent)

        def run(self):
                print('called SubClassThread.run()')
                self.delayed_print()
                self.exec_()

        def delayed_print(self):
                print('called SubClassThread.delayed_print()')
                PySide.QtCore.QTimer.singleShot(1000, self.print_things)
                print('end of delayed_print()')

        def print_things(self):
                print('called print_things')
                self.quit()

应用程序,test.py

^{pr2}$

最后,python test.py的输出:

Test: QThread subclassing
called SubClassThread.__init__()
called SubClassThread.run()
called SubClassThread.delayed_print()
end of delayed_print()
called print_things
app finished with exit code 0

关于QTimers,我学到了:对delayed_print()的调用在计时器仍在运行时完成,通过将quit()放入计时器调用的方法中,应用程序在调用该方法之前不会退出。在

如果有任何关于这段代码的评论,或者关于这个简单应用程序的Qt方面的评论,请发布!我在为初学者找到可访问的PyQt/PySide信息时遇到了一些困难。在

相关问题 更多 >