gpt4 book ai didi

python - 如何使 PySide.QtCore.QTimer.singleShot 调用其超时方法

转载 作者:行者123 更新时间:2023-12-01 03:47:00 27 4
gpt4 key购买 nike

我正在开发一个复杂且评论不佳的基于 Qt 的 Python 应用程序。它使用 PySide.QtCore.QTimer.singleShot(int,slot) 计时器来延迟线程内插槽的执行,我对这个计时器的工作原理感到困惑。

这是一个 MWE。此示例使用子类化 QThread 并重新实现 run() 的方法。我将以下内容放入名为timertester.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):

import sys
import time

import PySide

from timertester import SubClassThread

print('Test: QThread subclassing')
app = PySide.QtCore.QCoreApplication([])
sct = SubClassThread()
sct.finished.connect(app.exit)
sct.start()
sys.exit(app.exec_())

python test.py的输出:

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

奇怪的是,传递给 QTimer.singleShot 的可调用函数似乎永远不会被调用(输出中没有 叫 print_things() !)我将非常感谢您能提供的任何清晰信息关于这一点。我觉得我缺少 Qt 框架的一些简单成分。请耐心等待 - 我确实花了几个小时寻找这个问题的答案。

最佳答案

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

关于python - 如何使 PySide.QtCore.QTimer.singleShot 调用其超时方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38841289/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com