QTimer 是 Qt 框架提供的一个定时器类,它基于 QObject 的事件循环机制,可以周期性地或单次地触发超时事件,从而方便地实现延时操作或周期性任务。
主要特性
-
简单易用 :通过信号与槽机制,当定时器超时时会发出
timeout()信号,连接该信号即可执行自定义操作。 -
两种模式:
-
单次触发(single-shot):定时器仅触发一次,然后自动停止。
-
多次触发:定时器按照设定的时间间隔持续触发,直到手动停止。
-
-
精度:依赖于系统时钟和 Qt 事件循环的调度,通常情况下精度足够满足大多数应用需求(如动画、界面刷新、非实时数据采集)。对于高精度实时任务,可能需要更底层的计时器。
-
线程亲和性 :
QTimer属于创建它的线程,必须在该线程的事件循环中运行。如果在非 GUI 线程使用,需要确保该线程已启动事件循环(QThread::exec())。
常用方法
| 方法 | 说明 |
|---|---|
start(int msec) |
启动或重启定时器,间隔为 msec 毫秒。 |
start() |
使用当前设置的间隔启动定时器。 |
stop() |
停止定时器。 |
setInterval(int msec) |
设置定时器的时间间隔(毫秒)。 |
int interval() const |
返回当前设置的间隔。 |
setSingleShot(bool singleShot) |
设置是否为单次触发模式。默认为 false(重复触发)。 |
bool isSingleShot() const |
返回是否为单次模式。 |
bool isActive() const |
返回定时器是否正在运行。 |
static void singleShot(int msec, const QObject *receiver, const char *member) |
静态方法,创建一个单次定时器,超时后调用指定对象的成员函数(槽)。 |
意事项
-
事件循环依赖 :
QTimer依赖所在线程的事件循环。如果线程没有事件循环(如未调用exec()),定时器将无法触发。 -
精度:定时器的实际触发时间可能会因为事件队列中其他任务的阻塞而延迟。不适用于硬实时要求。
-
多线程 :在不同线程中使用
QTimer时,必须确保定时器对象属于目标线程,并且该线程有事件循环。通常通过将定时器移动到工作线程(moveToThread)实现。 -
资源释放:当父对象被销毁时,定时器会自动停止并销毁。如果创建时不指定父对象,需手动管理。