内心独白是大脑的新闻发言人:如何与脑内声音共处
2026/10/1 3:03:27
QTimer::timeout
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::started, worker, &Worker::doWork);
dynamicTimer->stop();
dynamicTimer->setInterval(500); // 改为0.5秒触发
dynamicTimer->start();
在Qt C++中,QTimer是处理定时任务的核心工具,适用于周期性操作、单次延时、线程协同等场景。以下是具体应用举例及代码解析:
场景:每秒更新UI显示(如倒计时、实时数据刷新)。
代码示例:
cpp
#include <QTimer> #include <QLabel> #include <QVBoxLayout> class TimerApp : public QWidget { Q_OBJECT public: TimerApp() { label = new QLabel("0", this); QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, [this]() { count++; label->setText(QString::number(count)); }); timer->start(1000); // 1秒触发一次 } private: QLabel *label; int count = 0; };关键点:通过timeout信号连接槽函数,start()启动周期性触发。
场景:5秒后自动跳转页面、网络请求超时处理。
代码示例:
cpp
QTimer::singleShot(5000, this, []() { qDebug() << "5秒后执行的任务"; // 如:跳转到首页、关闭弹窗等 });关键点:使用静态方法singleShot,无需创建对象,自动单次触发。
场景:后台线程执行定时任务(避免阻塞UI)。
代码示例:
cpp
class Worker : public QObject { Q_OBJECT public slots: void doWork() { QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, []() { qDebug() << "后台线程任务执行"; }); timer->start(1000); } }; // 主线程中 QThread workerThread; Worker *worker = new Worker; worker->moveToThread(&workerThread); connect(&workerThread, &QThread::started, worker, &Worker::doWork); workerThread.start();关键点:通过moveToThread将对象移入工作线程,定时器需在目标线程内启动。
场景:根据用户操作调整刷新频率(如动态图表)。
代码示例:
cpp
QTimer *dynamicTimer = new QTimer(this); connect(dynamicTimer, &QTimer::timeout, this, &MyClass::updateData); // 用户点击加速按钮时 void MyClass::onSpeedUp() { dynamicTimer->stop(); dynamicTimer->setInterval(500); // 改为0.5秒触发 dynamicTimer->start(); }场景:定时采集传感器数据、日志轮询。
代码示例:
cpp
// 创建无UI的定时任务 QTimer *sensorTimer = new QTimer(this); connect(sensorTimer, &QTimer::timeout, this, []() { // 读取传感器数据 double temp = readTemperature(); saveToDatabase(temp); }); sensorTimer->start(3000); // 每3秒采集一次QThread::exec()启动)。new QTimer(this)指定父对象,避免内存泄漏。sleep(),否则会冻结事件循环。通过灵活组合QTimer的周期性、单次触发特性及多线程机制,可覆盖从简单UI动画到复杂后台调度的各类定时需求。实际开发中,建议优先使用信号槽机制解耦业务逻辑,提升代码可维护性。