三、Qt6笔记——QTimer
1 基本概念
-
继承自
QObject
,可使用元对象系统。 -
QTimer 类提供了一个高级的定时器编程接口。要使用它,可以创建一个 QTimer 对象,将其 timeout() 信号连接到相应的槽函数,并调用 start()。从那时起,它将在固定的时间间隔内发出 timeout() 信号。
/** * 例如,设置一个一秒(1000 毫秒)的定时器(来自模拟时钟示例): * 之后,update() 槽函数每秒都会被调用。 */ QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update)); timer->start(1000);
- 通过调用 setSingleShot(true) 设置定时器只触发一次。你也可以使用静态函数 QTimer::singleShot(),在指定的时间间隔后调用槽函数触发一次:
QTimer::singleShot(200, this, &Foo::updateCaption);
-
在多线程应用程序中,你可以在任何带有事件循环的线程中使用 QTimer。要从非 GUI 线程启动事件循环,请使用 QThread::exec()。Qt 使用定时器的线程亲和性来确定哪个线程发出 timeout() 信号。因此,必须在定时器所属的线程中启动和停止它;不能从其他线程启动定时器。
作为一个特殊情况,超时时间为 0 的 QTimer 将尽快超时,但零定时器与其他事件源之间的顺序是未定义的。零定时器可用于在提供流畅的用户界面的同时执行一些工作:
QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &Foo::processOneThing); timer->start();
从那时起,processOneThing() 将被重复调用。它应以一种快速返回的方式编写(通常是在处理一个数据项后),以便 Qt 能够向用户界面发送事件,并在完成所有工作后停止定时器。这是传统的在 GUI 应用程序中实现繁重工作的方式,但随着多线程在越来越多的平台上变得可用,预计零毫秒的 QTimer 对象将逐渐被 QThread 取代。
2 使用总结
2.1 超时信号函数
当定时器超时的时候,会发射该信号(这是一个私有信号,可以被连接槽函数,但是不能被用户emit)
void QTimer::timeout() [private signal]
2.2 设定超时间隔
-
通过
setInterval
设定超时时间间隔(单位为ms)#include <QApplication> #include <QTimer> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); /* 创建一个定时器对象 */ QTimer timer; /* 设置定时器的超时时间为1秒 */ timer.setInterval(1000); /* 连接定时器的 timeout()信号到槽函数 */ QObject::connect(&timer, &QTimer::timeout, [&]() { qDebug() << "Timer timeout"; }); /* 启动定时器 */ timer.start(); return a.exec(); }
-
通过
start(std::chrono::milliseconds msec)
设定超时间隔。