【Qt】定时器--滚动相册
定时器用于实现定时触发操作,常用于周期性执行任务、延时处理等场景。
定时器可分为timerEvent和Qtimer两类。
timerEvent定时器事件
timerEvent(QTimerEvent *event)主要处理对象的ID
使用步骤
-
startTimer()//返回定时器编号=开始(定时时间)
-
timerEvent()//事件
-
killTimer()//结束(要结束的定时器ID)
使用例子(图片播放)
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#define TIMEOUT 1*1000
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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
#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
#ifndef WIDGET_H
#define WIDGET_H
#define TIMEOUT 1000#include <QWidget>
#include<QTimer>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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
#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");//标签里面显示setPixmapui->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 手动区分 |
功能丰富度 | 支持暂停、动态修改周期等 | 功能基础,需手动实现扩展逻辑 |
适用场景 | 大多数定时任务 | 轻量级场景或需要精细控制的情况 |