1 基本概念

  1. 继承自 QObject ,可使用元对象系统。

  2. QTimer 类提供了一个高级的定时器编程接口。要使用它,可以创建一个 QTimer 对象,将其 timeout() 信号连接到相应的槽函数,并调用 start()。从那时起,它将在固定的时间间隔内发出 timeout() 信号。

     /**
      * 例如,设置一个一秒(1000 毫秒)的定时器(来自模拟时钟示例):
      * 之后,update() 槽函数每秒都会被调用。
     */
     QTimer *timer = new QTimer(this);
     connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
     timer->start(1000);
    
  3. 通过调用 setSingleShot(true) 设置定时器只触发一次。你也可以使用静态函数 QTimer::singleShot(),在指定的时间间隔后调用槽函数触发一次:
     QTimer::singleShot(200, this, &Foo::updateCaption);
    
  4. 在多线程应用程序中,你可以在任何带有事件循环的线程中使用 QTimer。要从非 GUI 线程启动事件循环,请使用 QThread::exec()。Qt 使用定时器的线程亲和性来确定哪个线程发出 timeout() 信号。因此,必须在定时器所属的线程中启动和停止它;不能从其他线程启动定时器。

    作为一个特殊情况,超时时间为 0 的 QTimer 将尽快超时,但零定时器与其他事件源之间的顺序是未定义的。零定时器可用于在提供流畅的用户界面的同时执行一些工作:

     QTimer *timer = new QTimer(this);
     connect(timer, &QTimer::timeout, this, &Foo::processOneThing);
     timer->start();
    

    从那时起,processOneThing() 将被重复调用。它应以一种快速返回的方式编写(通常是在处理一个数据项后),以便 Qt 能够向用户界面发送事件,并在完成所有工作后停止定时器。这是传统的在 GUI 应用程序中实现繁重工作的方式,但随着多线程在越来越多的平台上变得可用,预计零毫秒的 QTimer 对象将逐渐被 QThread 取代。

2 使用总结

2.1 超时信号函数

当定时器超时的时候,会发射该信号(这是一个私有信号,可以被连接槽函数,但是不能被用户emit)

void QTimer::timeout() [private signal]

2.2 设定超时间隔

  1. 通过 setInterval 设定超时时间间隔(单位为ms)

     #include <QApplication>
     #include <QTimer>
     #include <QDebug>
    
     int main(int argc, char *argv[])
     {
         QApplication a(argc, argv);
    
         /* 创建一个定时器对象 */
         QTimer timer;
    
         /* 设置定时器的超时时间为1秒 */
         timer.setInterval(1000);
    
         /* 连接定时器的 timeout()信号到槽函数 */
         QObject::connect(&timer, &QTimer::timeout, [&]() {
             qDebug() << "Timer timeout";
         });
    
         /* 启动定时器 */
         timer.start();
    
         return a.exec();
     }
    
  2. 通过 start(std::chrono::milliseconds msec) 设定超时间隔。