QTimer 类提供重复和单次计时器。
QTimer 类为计时器提供了一个高级编程接口。要使用它,首先创建一个 QTimer实例,将其 timeout() 信号连接到相应的插槽,然后调用 start()。从那时起,它将以恒定的间隔发出 timeout() 信号。
一秒(1000毫秒)计时器的示例(来自模拟时钟示例):
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
从那时起,每秒调用一次 update() 槽函数。
也可以通过调用 setSingleShot(true) 将计时器设置为仅超时一次。您还可以使用静态 QTimer::singleShot() 函数在指定的时间间隔后调用槽函数:
QTimer::singleShot(200, this, SLOT(updateCaption()));
在多线程应用程序中,可以在任何具有事件循环的线程中使用 QTimer。要从非 GUI 线程启动事件循环,使用 QThread::exec()。Qt使用计时器的线程亲和力来确定哪个线程将发出timeout()信号。因此,您必须在其线程中启动和停止计时器;无法从另一个线程启动计时器。作为特殊情况timeout 为 0 的 QTimer 将在窗口系统的事件队列中的所有事件都得到处理后立即timeout。这可用于完成繁重的工作,同时提供活泼的用户界面:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start();
从那时起,processOneThing()槽函数将被重复调用。它应该以这样一种方式编写,即它总是快速返回(通常在处理一个数据项之后),以便Qt可以将事件传递到用户界面,并在完成所有工作后立即停止计时器。这是在GUI应用程序中实现繁重工作的传统方式,但随着多线程在越来越多的平台上变得可用,我们预计零毫秒QTimer对象将逐渐被QThreads取代。
定时器精度和分辨率
计时器的准确性取决于底层操作系统和硬件。大多数平台都支持 1 毫秒的分辨率,尽管在许多现实情况下,计时器的精度不会等于此分辨率。
精度还取决于计时器类型。对于Qt::PreciseTimer,QTimer将尝试将精度保持在1毫秒。精确的计时器也不会比预期早超时。对于 Qt::CoarseTimer 和 Qt::VeryCoarseTimer 类型,QTimer 可能会比预期更早timeout,在这些类型的范围内:Qt::CoarseTimer 的间隔为 5%,Qt::VeryCoarseTimer 的间隔为 500 毫秒。如果系统繁忙或无法提供请求的准确性,则所有计时器类型都可能晚于预期超时。在timeout 溢出的情况下,Qt只会发出一次active(),即使多个超时已经过期,然后恢复原始间隔。
后续公众号会发布系列教程,更多内容请关注公众号:程序猿学习日记