Qt-定时器的实现

实现定时器的多种方法

  • QTimer类
  • QTimerEvent

QTimer类

QTimer可以通过设定超时时间并调用start函数,以固定频率发送timeout信号。

使用

1
2
3
4
5
6
7
#include <QTimer>
MainWindow::MainWindow()
{
QTimer* timer = new QTimer(this);
connect(timer,&QTimer::timeout,this,&MainWindow::timeoutSlot);
timer->start(3000);// Triggered every 3 seconds
}

注意

  • 使用setSingleShot(true)或静态函数QTimer::singleShot()实现单次定时器;
  • 当父对象销毁时,QTimer对象也会跟着销毁;
  • 精度取决于硬件和操作系统以及QTimerType
    • QTimerType::PreciseTimer=0:保持毫秒级精度;
    • QTimerType::CoarseTimer=1:保持精度在设定值的5%;
    • QTimerType::VeryCoarseTimer=2:保持精度在500毫秒。

QTimerEvent

QTimerEvent的使用需要搭配QObject::startTimer,即类需继承自QObject且实现timerEvent事件处理器。

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <QObject>
class MainWindow : public QObject
{
Q_OBJECT
MainWindow()
{
timerIdFirst = startTimer(1000);
timerIdSecond = startTimer(3000);
}
protected:
void timerEvent(QTimerEvent* e)
{
if(e->timerId()==timerIdFirst)
{
// dosomething...
}
else if(e->timerId()==timerIdSecond)
{
// dosomething...
}
}
private:
int timerIdFirst, timerIdSecond;
}

注意

此方法无法实现类似QTimer::singleShot这种单次定时器以及信号的高级用法。