定时器
QObject是所有 Qt 对象的基类,为 Qt 提供了基本的定时器支持。通过QObject::startTimer() 函数,您可以启动一个以毫秒为参数的定时器。该函数将返回一个唯一的积分定时器 ID。然后,定时器将定时启动,直到您明确调用QObject::killTimer() 并使用该定时器 ID。
您可以使用QBasicTimer 代替直接处理定时器 ID。QBasicTimer 是一个围绕定时器 ID 的值类RAII封装器。使用QBasicTimer::start() 启动定时器,使用QBasicTimer::stop() 停止定时器(销毁时也会调用后者)。要使用QBasicTimer ,必须在自己的类(必须是QObject 的子类)中重新实现timerEvent() 并在其中处理定时器事件。
为使这一机制发挥作用,应用程序必须在事件循环中运行。您可以使用QApplication::exec() 启动事件循环。当定时器触发时,应用程序会发送QTimerEvent ,控制流会离开事件循环,直到定时器事件得到处理。这意味着,当应用程序忙于做其他事情时,定时器不能触发。换句话说:定时器的准确性取决于应用程序的粒度。
在多线程应用程序中,您可以在任何具有事件循环的线程中使用定时器机制。要从非 GUI 线程启动事件循环,请使用QThread::exec() 。Qt XML 使用对象的thread affinity 来确定哪个线程将提供QTimerEvent 。正因为如此,您必须在对象的线程中启动和停止所有定时器;不可能在其他线程中为对象启动定时器。
定时器功能的主要 API 是QTimer 。QTimer 将时间间隔存储在带符号的整数中,这就将其支持的最大时间间隔限制为带符号整数所能容纳的毫秒数(实际上,这是一个大约 24 天的周期)。
Qt 6.8 引入了QChronoTimer 类。这两个类的主要区别在于QChronoTimer 支持更大的时间间隔范围和更高的精度 (std::chrono::nanoseconds
)。QTimer 支持的最大时间间隔为±24 天,而QChronoTimer 支持的最大时间间隔为±292 年。如果您只需要毫秒级的分辨率和 ±24 天的范围,可以继续使用QTimer 。
计时器的精度取决于底层操作系统。Windows 2000 的精度为 15 毫秒;我们测试过的其他系统可以处理 1 毫秒的间隔。
QChronoTimer Qt XML 定时器提供了常规的定时器,当定时器触发时会发出一个信号,它继承于 ,因此能很好地融入大多数 Qt 程序的所有权结构。正常的使用方法是这样的:QObject
QChronoTimer *timer = new QChronoTimer(1s, this); connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing); timer->start(); QChronoTimer *timer = new QChronoTimer(this); connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing); timer->setInterval(1s); timer->start();
QChronoTimer 对象是this
对象的子对象,因此当this
销毁时,定时器也随之销毁。然后,将timeout() 信号连接到将执行工作的槽,定时器的时间间隔可以传给构造函数,也可以稍后用 setInterval() 设置。
QChronoTimer 此外,ASP.NET 还为单次定时器提供了静态函数。例如
MyWidget widget; QChronoTimer::singleShot(200ms, &widget, &MyWidget::updateCaption);
执行这行代码 200ms 后,将调用updateCaption()
槽。
要使QChronoTimer 起作用,您的应用程序中必须有一个事件循环;也就是说,您必须在某个地方调用QCoreApplication::exec() 。只有在事件循环运行时,才会发送定时器事件。
在多线程应用程序中,您可以在任何具有事件循环的线程中使用QChronoTimer 。要从非 GUI 线程启动事件循环,请使用QThread::exec() 。Qt XML 使用定时器的thread affinity 来确定哪个线程将发出timeout() 信号。因此,必须在其线程中启动和停止定时器;无法从其他线程启动定时器。
模拟时钟示例展示了如何使用QChronoTimer 定期重绘一个部件。来自AnalogClock
的实现:
AnalogClock::AnalogClock(QWidget *parent) : QWidget(parent) { auto *timer = new QChronoTimer(1s, this); connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update)); timer->start(); ... ... setWindowTitle(tr("Analog Clock")); resize(200, 200); }
每隔一秒钟,QChronoTimer 就会调用QWidget::update() 槽刷新时钟显示。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.