Qt中的QTimer类

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)实现。

  • 资源释放:当父对象被销毁时,定时器会自动停止并销毁。如果创建时不指定父对象,需手动管理。

相关推荐
Zguigo1 小时前
【CUDA8】第一个CUDA C++ Kernel --vector add
java·开发语言·c++
-Marks-1 小时前
【C++编程】STL容器(二)--- vector底层模拟实现(常用接口实现 | 扩容机制 | 深浅拷贝 | 迭代器失效)
开发语言·c++·vector·内存管理·迭代器失效·vector底层模拟实现
Shadow(⊙o⊙)2 小时前
C++11并发支持库
开发语言·c++
一技安身2 小时前
【java】JDK8 + JDK17 绿色解压共存方案-全程不修改任何系统环境变量
java·开发语言
hudd6682 小时前
JavaEE 初阶 - 多线程(初阶)
java·开发语言·java-ee
I Am a robert girl3 小时前
稀有事件估计的迭代去对齐:从源码视角拆解重要性采样新范式
开发语言·python·机器学习·重要性采样·蒙特卡洛方法·稀有事件估计
golang学习记3 小时前
rust开发,选VS Code还是RustRover?
开发语言·后端·rust
打工仔折腾 AI3 小时前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战
CarIise3 小时前
Java实训阶段查漏补缺复习笔记1
java·开发语言·笔记
事圆则缓3 小时前
Kotlin 泛型方差实战:out、in、星投影与类型擦除
android·开发语言·kotlin