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

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

相关推荐
科技道人14 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
逝水无殇16 小时前
C# 异常处理详解
开发语言·后端·c#
玖玥拾18 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾18 小时前
Rust 学习目录
开发语言·学习·rust
云泽80818 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦18 小时前
GO---可见性规则
开发语言·golang
逝水无殇19 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
这是个栗子20 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ20 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香20 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript