定时器用于实现定时触发操作,常用于周期性执行任务、延时处理等场景。
定时器可分为timerEvent和Qtimer两类。
timerEvent定时器事件
timerEvent(QTimerEvent *event)主要处理对象的ID
使用步骤
-
startTimer()//返回定时器编号=开始(定时时间)
-
timerEvent()//事件
-
killTimer()//结束(要结束的定时器ID)
使用例子(图片播放)
widget.h
cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#define TIMEOUT 1*1000
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
virtual void timerEvent(QTimerEvent *event);//定时事件(在widget.cpp中实现)
~Widget();
private slots:
void on_staretButton_clicked();
void on_stopButton_clicked();
private:
Ui::Widget *ui;
int myTimerID;//每个定时器有一个自己的编号
int picID;//图片名字
};
#endif // WIDGET_H
widget.cpp
cpp
#include "widget.h"
#include "./ui_widget.h"
Widget::Widget(QWidget *parent):
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//初始化刚开始就要得到一张图片
picID = 2;//下一个图片
QPixmap pix("D:\\Item\\QtProject\\objectTimer\\pic\\1.png");
ui->label->setPixmap(pix);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_staretButton_clicked()
{
//开启定时器,返回定时器编号
myTimerID = this->startTimer(TIMEOUT);//记录的超时时间
}
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()!=myTimerID)return;//如果不是开始的这个计时器id就不继续功能
//获取图片路径和名称
QString path("D:\\Item\\QtProject\\objectTimer\\pic\\");
path +=QString::number(picID);
path +=".png";
QPixmap pix(path);
ui->label->setPixmap(pix);//显示
picID++;//找到下一个图片显示
if(picID==5)//一共4张图片
picID = 1;//循环完重新到1;
}
void Widget::on_stopButton_clicked()
{
//杀死指定定时器
this->killTimer(myTimerID);
}
Qtimer
头文件:<QTimer>
支持信号与槽机制
使用步骤
- QTimer *timer;//创建一个定时器对象
- connect(timer, &QTimer::timeout, this, &Widget::timeoutSlot);//连接信号与槽
- timer->start(时间);
- 处理的槽函数
- timer->stop();
- QTimer::singleShot(时间,接收者(this),槽函数);//发出信号
使用例子(图片播放)
widget.h
cpp
#ifndef WIDGET_H
#define WIDGET_H
#define TIMEOUT 1000
#include <QWidget>
#include<QTimer>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_startButton_clicked();
//槽函数必须写在slots下面
void timeoutSlot();
void on_stopButton_clicked();
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QTimer *timer;//创建一个定时器对象
int picID;
};
#endif // WIDGET_H
widget.cpp
cpp
#include "widget.h"
#include "./ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
picID = 2;
//创建定时器对象
timer = new QTimer;
//用QImage对象显示图片
QImage img;
img.load("D:\\Item\\QtProject\\objectTimer\\pic\\1.png");
//标签里面显示setPixmap
ui->label->setPixmap(QPixmap::fromImage(img));
//定时器时间到,发出timeout信号,connect处理(发出者,发出信号,接收者,处理方法)
connect(timer, &QTimer::timeout, this, &Widget::timeoutSlot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_startButton_clicked()
{
//开始定时器
timer->start(TIMEOUT);
}
void Widget::timeoutSlot()
{
QString path("D:\\Item\\QtProject\\objectTimer\\pic\\");
path += QString::number(picID);
path += ".png";
QImage img;
img.load(path);
ui->label->setPixmap(QPixmap::fromImage(img));
picID++;
if(picID==5)
picID = 1;
}
void Widget::on_stopButton_clicked()
{
timer->stop();
}
void Widget::on_pushButton_clicked()
{
//singleShot(时间,接收者,槽函数)
QTimer::singleShot(1000,this,SLOT(timeoutSlot()));
}
两种方式的对比
特性 | QTimer 类 | 定时器事件(timerEvent) |
---|---|---|
使用复杂度 | 简单(信号槽机制) | 稍复杂(需管理 ID 和事件) |
多定时器管理 | 方便(每个 QTimer 独立) | 需通过 ID 手动区分 |
功能丰富度 | 支持暂停、动态修改周期等 | 功能基础,需手动实现扩展逻辑 |
适用场景 | 大多数定时任务 | 轻量级场景或需要精细控制的情况 |