一、QTimer

QTimer是Qt自带的定时器类,使用非常简单,只需要定义一个定时器,然后绑定槽函数,启动就行了,​​start(int msec)​​函数内传的是毫秒,所以1000是1秒钟,也就是说槽函数会1秒针被调用一次。例如:

#include <QTimer>

QTimer* timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(slot_timeout()));
timer->start(1000);

void MainWindow::slot_timeout()
{
...
}

QTimer用​​stop()​​​停止,QTimer也提供了接口只运行一次​​singleShot()​


二、timerEvent

​void timerEvent(QTimerEvent *)​​​是QObject类的内置事件,所以只要继承至QObject的类都可以使用,使用非常简单,只要重写该事件函数,然后​​startTimer(int msec)​​即可。例如:

#ifndef
#define

#include <QMainWindow>
#include <QTimerEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

int timerID1;
int timerID2;
void timerEvent(QTimerEvent* );

void start_timerID1();
void stop_timerID1();
void start_timerID2();
void stop_timerID2();

private:
Ui::MainWindow *ui;
};
#endif// MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

timerID1 = -1;
timerID2 = -1;
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::timerEvent(QTimerEvent* event)
{
if(event->timerId() == 1)
{
//timerID1值为1
}
if(event->timerId() == 2)
{
//timerID2值为2
}
}

void MainWindow::start_timerID1()
{
if(timerID1 == -1)
timerID1 = startTimer(2000);
}
void MainWindow::stop_timerID1()
{
if(timerID1 != -1)
{
killTimer(timerID1);
timerID1 = -1;
}
}
void MainWindow::start_timerID2()
{
if(timerID2 == -1)
timerID2 = startTimer(1000);
}
void MainWindow::stop_timerID2()
{
if(timerID2 != -1)
{
killTimer(timerID2);
timerID2 = -1;
}
}

如上所示,timerEvent可以启动多个定时器,只需要​​startEvent(int msec)​​​多次即可,id从1开始累加,关闭定时器用​​killTimer(int timerID)​​​,当使用多个定时器时可在事件函数中用​​event->timerId()​​获取当前响应的定时器的ID编号。


三、定时器事件 + 绘图事件 = 动画

在自定义控件的时候常常会用到绘图事件,往往我们会将控件进行分步绘制,例如:

绘制一个时钟:

  • 绘制表盘
  • 绘制刻度
  • 绘制指针

表盘和刻度这些都是固定的,所以只需要一次绘制就可以了,但是指针是动态的,所以需要动态的绘制。我们只需在定时器事件中改变绘图事件里的某些参数,就能实现动画的效果。例如:秒针的运行,定时器定时1秒,定时器事件中修改秒针一端的坐标(秒针就是一条线),然后在绘图事件中每次的坐标都不一样,当然绘制的效果就不一样,加上定时器一直在走,一帧一帧加起来就形成了动画了。

例如:自定义的等待提示控件

Qt定时器使用总结+动画实例_控件