gpt4 book ai didi

qt - 取消所有未完成的 QTimer 事件

转载 作者:行者123 更新时间:2023-12-04 12:13:47 25 4
gpt4 key购买 nike

我正在寻找一种在 pyqt 中设置多个定时函数调用的方法,并在需要时取消所有挂起的调用。
我正在考虑使用 QtCore.QTimer设置函数调用,但我不知道取消这些调用的任何好方法。有任何想法吗?

使用 QtCore.QTimer.singleShot(1000, self.function) 后我似乎找不到任何取消方法.如果相反,我创建了一个列表 QTimer我可以阻止它们,但随后我不得不管理一个我想避免的计时器对象列表(创建、删除、事件等)。

# Setup a timer object.
timer = QtCore.QTimer(self)
timer.timeout.connect(self.function)
timer.setSingleShot(True)
timer.start(1000)

# To stop the timer object at some later point.
timer.stop()

我也可以管理我自己的待处理函数调用队列,如果可能的话,我也想避免(为了简单起见)。

这是一些虚拟代码,显示了我正在尝试做的事情:
import sys
from PyQt4 import QtCore

class Test(QtCore.QObject):

def __init__(self, parent=None):
QtCore.QObject.__init__(self, parent)


def addDelayedCall(self, time, function):
# Do something here.
pass


def clearPendingCalls(self):
print(' Clearing pending function calls.')
# Do something here.


def setupCalls(self):
self.addDelayedCall(500, self.dummy)
self.addDelayedCall(1000, self.dummy)
self.addDelayedCall(1500, self.dummy)
self.addDelayedCall(2000, self.dummy)


def dummy(self):
print('dummy just got called.')


if __name__ == '__main__':
app = QtCore.QCoreApplication(sys.argv)
test = Test(app)

QtCore.QTimer.singleShot(0, test.setupCalls)
QtCore.QTimer.singleShot(1250, test.clearPendingCalls)

QtCore.QTimer.singleShot(5000, app.quit)
sys.exit(app.exec_())

最佳答案

我通过直接使用 QObject 提供的计时器功能提出了一个解决方案。 .我怀疑有一个更优雅的解决方案,但这可能会满足我的需要。

import sys
from PyQt4 import QtCore


class Test(QtCore.QObject):

def __init__(self, parent=None):
QtCore.QObject.__init__(self, parent)

self.timers = {}


def timerEvent(self, event):
function = self.timers.pop(event.timerId())
self.killTimer(event.timerId())
function()


def addDelayedCall(self, time, function):
timer_id = self.startTimer(time)

self.timers[timer_id] = function


def clearPendingCalls(self):
print(' Clearing pending function calls.')

while self.timers:
timer_id, function = self.timers.popitem()
self.killTimer(timer_id)


def setupCalls(self):
self.addDelayedCall(500, self.dummy)
self.addDelayedCall(1000, self.dummy)
self.addDelayedCall(1500, self.dummy)
self.addDelayedCall(2000, self.dummy)


def dummy(self):
print('dummy just got called.')




if __name__ == '__main__':
app = QtCore.QCoreApplication(sys.argv)
test = Test(app)

QtCore.QTimer.singleShot(0, test.setupCalls)
QtCore.QTimer.singleShot(1250, test.clearPendingCalls)

QtCore.QTimer.singleShot(5000, app.quit)
sys.exit(app.exec_())

关于qt - 取消所有未完成的 QTimer 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5071400/

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