Qt定时器使用总结+动画实例
原创
©著作权归作者所有:来自51CTO博客作者贝勒里恩的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、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秒,定时器事件中修改秒针一端的坐标(秒针就是一条线),然后在绘图事件中每次的坐标都不一样,当然绘制的效果就不一样,加上定时器一直在走,一帧一帧加起来就形成了动画了。
例如:自定义的等待提示控件