1.界面布局
2.初始化
2.1在widget.h中
#include <QTimer>
private:
QTimer *timer;
#include <QTimer>
引入Qt的定时器功能,让程序可以使用QTimer类private: QTimer *timer;
在类的私有区域声明一个QTimer指针变量,准备创建一个定时器对象
2.2在widget.cpp中
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
timer = new QTimer;//用来初始化
}
-
: QWidget(parent), ui(new Ui::Widget)- 调用父类QWidget的构造函数
- 创建UI界面对象
-
ui->setupUi(this);- 设置并显示UI界面
-
timer = new QTimer;- 创建一个新的定时器对象
3.实现开始按钮
3.1widget.h中
#define TIMEOUT 1000
#define TIMEOUT 1000定义1秒的定时器间隔常量(1000毫秒)
3.2widget.cpp中
void Widget::on_startButton_clicked()
{
timer->start(TIMEOUT);
}
-
on_startButton_clicked()- 这是一个 槽函数(slot) ,通常与 UI 按钮的
clicked()信号连接(Qt 的信号槽机制)。 - 当用户点击
startButton按钮时,该函数会被调用。
- 这是一个 槽函数(slot) ,通常与 UI 按钮的
-
timer->start(TIMEOUT);-
timer是之前初始化的QTimer对象(见之前的代码)。 -
start(TIMEOUT)方法:- 启动定时器。
- 设置超时时间为
TIMEOUT(即 1000 毫秒)。 - 定时器会每隔 1 秒发出一个
timeout()信号,可以连接该信号到某个槽函数执行周期性任务。
-
4.实现第一张图片
- 初始化 UI 界面(由 Qt Designer 设计)
- 创建一个
QTimer对象(用于定时任务) - 加载一张图片并显示在
QLabel上
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
timer = new QTimer;
QImage img;
img.load("E:\\project\\1.jpg");
ui->label->setPixmap(QPixmap::fromImage(img));
}
-
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)QWidget(parent):调用父类QWidget的构造函数,传入父窗口指针parent(用于窗口层级管理)。ui(new Ui::Widget):动态创建一个Ui::Widget对象(UI 界面类),用于管理界面控件。
-
ui->setupUi(this);setupUi(this):加载并初始化 UI 界面(如.ui文件定义的布局和控件),并将其附加到当前Widget对象。
-
timer = new QTimer;new QTimer:创建一个QTimer对象(定时器),用于在后续代码中执行定时任务(如周期性触发信号)。
-
图片加载与显示部分
QImage img;:创建一个QImage对象,用于存储图片数据。img.load("E:\project\1.jpg");:从指定路径加载图片文件。ui->label->setPixmap(QPixmap::fromImage(img));:将图片转换为QPixmap并显示在名为label的控件上。
5.实现信号与槽
因为实现按钮过了一秒之后会发出一个信号,需要槽函数来处理
5.1widget.h中
private slots:
void on_startButton_clicked();
void timeoutSlot();
private:
Ui::Widget *ui;
QTimer *timer;
int picID;
};
-
私有槽函数(private slots) :
on_startButton_clicked()- 处理开始按钮点击事件timeoutSlot()- 处理定时器超时事件
-
私有成员变量(private) :
ui- 指向界面对象的指针timer- QTimer定时器对象指针picID- 整型变量,可能用于图片标识/索引
5.2widget.cpp中
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
timer = new QTimer;
picID = 2;
QImage img;
img.load("E:\\project\\1.jpg");
ui->label->setPixmap(QPixmap::fromImage(img));
//定时器时间到,发出timeout信号
connect(timer,&QTimer::timeout,this,&Widget::timeoutSlot);
}
-
基本结构:
cpp
connect(发送者, 发送的信号, 接收者, 处理的槽函数); -
参数分解:
timer:信号发送者(QTimer 对象指针)&QTimer::timeout:要连接的信号(定时器超时信号)this:信号接收者(当前 Widget 对象)&Widget::timeoutSlot:接收信号后要执行的槽函数
-
信号与槽的特点:
- 当
timer->start()启动后,每次到达设定的时间间隔 timer就会自动发射(emit)timeout()信号- Qt 的事件系统会自动调用连接的
timeoutSlot()函数
- 当
6.实现切换图片
void Widget::timeoutSlot()
{
// 1. 构造图片路径(如"E:\project\2.jpg")
QString path("E:\\project\\");
path += QString::number(picID); // 当前图片ID
path += ".jpg";
// 2. 加载并显示图片
QImage img;
img.load(path); // 加载图片文件
ui->label->setPixmap(QPixmap::fromImage(img)); // 在label上显示
// 3. 更新图片序号(实现轮播)
picID++; // 准备下一张图片
if(picID == 6) // 超过最大值时
picID = 1; // 循环回到第一张
}
7.实现结束功能
void Widget::on_stopButton_clicked()
{
timer->stop();
}
8.实现单次点击功能
void Widget::on_singleButton_clicked()
{
QTimer::singleShot(1000,this,SLOT(timeoutSlot()));
}
-
核心功能:
QTimer::singleShot(1000, this, SLOT(timeoutSlot()));- 设置一个只触发一次的定时器
- 1000毫秒(1秒)后自动执行
timeoutSlot()槽函数
-
参数说明:
1000:延迟时间(毫秒)this:接收者对象(当前窗口)SLOT(timeoutSlot()):要执行的槽函数
-
与传统定时器的区别:
特性 QTimer::singleShot 普通 QTimer 触发次数 仅一次 循环触发 内存管理 自动释放 需手动管理 适用场景 延迟单次操作 周期任务 -
实际效果:
-
点击按钮后:
- 等待1秒钟
- 自动执行一次
timeoutSlot()(显示下一张图片) - 定时器自动销毁
-
9.完整代码
9.1在widget.h中
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>
#define TIMEOUT 1000
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();
void timeoutSlot();
void on_stopButton_clicked();
void on_singleButton_clicked();
private:
Ui::Widget *ui;
QTimer *timer;
int picID;
};
#endif // WIDGET_H
9.2在widget.cpp中
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
timer = new QTimer;
picID = 2;
QImage img;
img.load("E:\\project\\1.jpg");
ui->label->setPixmap(QPixmap::fromImage(img));
connect(timer,&QTimer::timeout,this,&Widget::timeoutSlot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_startButton_clicked()
{
timer->start(TIMEOUT);
}
void Widget::timeoutSlot()
{
QString path("E:\\project\\");
path += QString::number(picID);
path += ".jpg";
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_singleButton_clicked()
{
QTimer::singleShot(1000,this,SLOT(timeoutSlot()));
}