警告
本节包含从C++自动翻译成Python的代码片段,可能会导致错误。
定时器#
如何在您的应用程序中使用Qt定时器。
QObject
, 所有Qt对象的基础类,提供了Qt的定时器支持。通过 startTimer()
方法,您可以使用以毫秒为间隔的参数启动定时器。该函数返回一个唯一的整数定时器ID。定时器将现在以规律的时间间隔触发,直到您显式地调用 killTimer()
方法并传入定时器ID来停止定时器。
为了使此机制正常工作,应用程序必须在事件循环中运行。您使用 QApplication::exec() 启动事件循环。当一个定时器触发时,应用程序发送一个 QTimerEvent
,然后控制流离开事件循环,直到处理定时器事件。这意味着定时器无法在您的应用程序忙于做其他事情时触发。换而言之:定时器的准确性取决于应用程序的粒度。
在多线程应用程序中,您可以在任何具有事件循环的线程中使用定时器机制。要从非GUI线程启动事件循环,请使用 exec()
方法。Qt使用对象的 thread affinity
属性来确定哪个线程将传递 QTimerEvent
。因此,您必须在对象的线程中启动和停止所有定时器;不能为其他线程中的对象启动定时器。
间隔值的上限由可指定在有符号整数中的毫秒数确定(实际上,这是一个大约24天多的周期)。准确性取决于底层操作系统。Windows 2000有15毫秒的精度;其他我们已经测试过的系统可以处理1毫秒的间隔。
定时功能的主要API是 QTimer
。该类提供周期性定时器,当定时器触发时发出信号,并继承自 QObject
,因此非常适合大多数Qt程序的所有权结构。其正常使用方式如下
timer = QTimer(self) timer.timeout.connect(self.updateCaption) timer.start(1000)
将 QTimer
对象设置为 this
对象的子对象,这样当 this
对象被删除时,定时器也会被删除。接下来,将其 timeout()
信号连接到将执行工作的槽,启动时设置为1000毫秒,这意味着它将每秒超时一次。
QTimer
还提供了一个用于单次定时器的静态函数。例如
QTimer::singleShot(200, self.updateCaption)
在这行代码执行200毫秒(0.2秒)后,将调用 updateCaption()
槽。
要使 QTimer
工作,你的应用程序必须有一个事件循环;也就是说,你必须某处调用 exec()
。仅当事件循环正在运行时,才会传递定时器事件。
在多线程应用程序中,你可以在任何拥有事件循环的线程中使用 QTimer
。要从非GUI线程启动事件循环,使用 exec()
。Qt使用定时器的 thread affinity
确定哪个线程将发出 timeout()
信号。因此,你必须在其线程中启动和停止定时器;无法从另一个线程启动定时器。
模拟时钟示例展示了如何使用 QTimer
在固定时间间隔重绘小部件。从 AnalogClock
的实现
def __init__(self, parent): super().__init__(parent) timer = QTimer(self) timer.timeout.connect(this, QOverload<>::of(&AnalogClock::update)) timer.start(1000) ...
每秒,QTimer
将调用 QWidget::update() 槽来刷新时钟的显示。
如果您已经有一个 QObject
子类,并希望进行简单的优化,您可以使用 QBasicTimer
而不是 QTimer
. 使用 QBasicTimer
时,您必须在您的 QObject
子类中重新实现 timerEvent()
方法并在那里处理超时。