当前位置: 首页 > news >正文

QtC++定时3秒执行槽函数实战

记忆要点

// 连接超时信号到槽函数
QObject::connect(timer, &QTimer::timeout, &myObject, &MyClass::delayedSlot);

1.QtC++定时3秒执行槽函数实战

在Qt C++中实现3秒后执行槽函数,推荐使用QTimer的单次定时模式。以下是完整实现步骤和代码示例:

核心实现思路

  1. 创建QTimer对象并设置为单次触发模式(setSingleShot(true)
  2. 设置超时时间为3000毫秒(3秒)
  3. 连接timeout()信号到目标槽函数
  4. 启动定时器

代码示例

cpp

#include <QCoreApplication> #include <QTimer> #include <QDebug> class MyClass : public QObject { Q_OBJECT public: explicit MyClass(QObject *parent = nullptr) : QObject(parent) {} public slots: void delayedSlot() { qDebug() << "槽函数在3秒后执行!当前时间:" << QTime::currentTime(); } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyClass myObject; QTimer *timer = new QTimer(&a); // 父对象设为应用程序对象,自动释放内存 // 设置单次触发模式 timer->setSingleShot(true); // 设置超时时间(单位:毫秒) timer->setInterval(3000); // 连接超时信号到槽函数 QObject::connect(timer, &QTimer::timeout, &myObject, &MyClass::delayedSlot); qDebug() << "定时器已启动,等待3秒..." << QTime::currentTime(); timer->start(); // 启动定时器 return a.exec(); } // 头文件中必须包含Q_OBJECT宏(在.pro文件中加入QT += widgets) // 编译时需要启用moc(如果使用qmake,自动处理;CMake需配置set(CMAKE_AUTOMOC ON))

关键点说明

  1. 单次触发模式:通过setSingleShot(true)确保定时器只触发一次
  2. 内存管理:将定时器父对象设置为应用程序对象(&a),避免内存泄漏
  3. 时间单位setInterval()参数单位为毫秒,3秒=3000毫秒
  4. 线程安全:此方案在主线程中运行,如需跨线程需使用QObject::connect的第四个参数指定连接类型

替代方案对比

方案优点缺点
QTimer官方推荐、非阻塞、线程安全需要额外对象
QEventLoop可配合QWaitCondition阻塞主线程、破坏事件循环
QThread::sleep简单直观完全阻塞线程、不推荐

强烈推荐使用QTimer方案,它符合Qt的事件驱动模型,不会阻塞界面响应,且内存管理安全。

2.Qt定时3秒执行槽函数最佳方案

在Qt中实现3秒后单次执行槽函数,使用QTimer::singleShot()是最简洁直接的方案,无需手动管理定时器对象或循环逻辑。以下是具体实现:

推荐方案:QTimer::singleShot()

cpp

#include <QCoreApplication> #include <QTimer> #include <QDebug> #include <QTime> class MyClass : public QObject { Q_OBJECT public: explicit MyClass(QObject *parent = nullptr) : QObject(parent) {} public slots: void delayedSlot() { qDebug() << "槽函数在3秒后执行!当前时间:" << QTime::currentTime(); } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyClass myObject; // 3秒后触发myObject的delayedSlot槽函数 QTimer::singleShot(3000, &myObject, &MyClass::delayedSlot); qDebug() << "定时任务已安排,等待3秒..." << QTime::currentTime(); return a.exec(); }

方案优势

  1. 代码极简:仅需1行代码实现延迟调用
  2. 自动内存管理:无需手动创建/销毁QTimer对象
  3. 线程安全:默认在主线程执行,跨线程需指定连接类型
  4. 无循环依赖:单次触发后自动结束,无事件循环残留

关键参数说明

  • 延迟时间:3000毫秒(3秒),单位为毫秒
  • 对象指针&myObject指定槽函数所属对象
  • 槽函数签名&MyClass::delayedSlot需与类声明中的槽函数完全匹配

替代方案对比

方案代码量内存管理线程安全推荐指数
QTimer::singleShot()自动★★★★★
手动QTimer+setSingleShot⭐⭐⭐需父对象★★★★
QEventLoop+QWaitCondition⭐⭐⭐⭐手动

结论QTimer::singleShot()是Qt官方推荐的单次定时任务解决方案,完美匹配“3秒后执行且无需循环”的需求,代码简洁高效,内存安全无泄漏。

http://www.jsqmd.com/news/106450/

相关文章:

  • 每日 AI 评测速递来啦(12.17)
  • MyBatis-Plus 报错 Invalid bound statement(insert)?其实是 SqlSessionFactoryBean 踩坑了
  • 【2025最新】Sumatra PDF 下载安装教程:轻量高效的PDF阅读器全方位指南
  • 小白也能跑通华为云OCR:手把手整合 Hutool 与华为云签名 SDK 并解决依赖难题
  • Qt/C++实现Ubuntu应用自重启
  • C++可变参数队列与压栈顺序:从模板语法到汇编调用约定的深度解析
  • 2025年12月HT250灰铁,HT200灰铁,灰铁棒料厂商推荐:聚焦铸造企业综合实力与核心竞争力 - 品牌鉴赏师
  • 【从 “堵车” 到 “飙车”:Java 并发 / 并行终极解析 + 接口抗并发实战指南】
  • Qt实现Ubuntu程序自动重启
  • 制砂机远程监控运维管理系统方案
  • 2025年12月水处理设备用阻垢剂,水处理设备用活性炭,地下水处理设备公司推荐:资质核验+案例解析 - 品牌鉴赏师
  • 灌区PLC阀门远程监控运维系统方案
  • 2025年12月食堂净化水处理设备,除铁锰水处理设备,反渗透水处理设备厂家榜:适配性与能耗双维度测评 - 品牌鉴赏师
  • 机器学习--逻辑回归
  • 29、Unix 文件操作与管理全解析
  • 第1节:项目性能优化(上)
  • 什么是云桌面?一般都用哪些云桌面?
  • 解析现代网络的“神经系统”—BGP-LS-SPF
  • Linux-LVM 方式挂载大于3T磁盘,详细操作过程
  • 30、深入理解 inotify 与内存管理
  • 【昇腾CANN训练营·核心篇】拒绝“写死”:Ascend C 算子动态 Tiling 的设计哲学
  • win11使用KMS命令激活
  • 学习日记day50
  • 【LangChain4J】图生文文生图,以及第三方平台集成
  • 用频繁跳槽换来的技术积累,对于实际的开发人员来说不是什么好事。 - ukyo-
  • 12月17日
  • “管理员阻止你运行此应用”怎么办?详解系统权限解除与一键修复方案
  • 第11讲 蓝牙模块与建议数据包解析
  • AI agent 最新 进展
  • 商品颜色/尺码选项太多|谷歌爬虫不收录怎么办