7.QTimer定时器

149 阅读5分钟

1.界面布局

image.png

2.初始化

2.1在widget.h中

#include <QTimer>

private:
    QTimer *timer;
  1. #include <QTimer>
    引入Qt的定时器功能,让程序可以使用QTimer类
  2. private: QTimer *timer;
    在类的私有区域声明一个QTimer指针变量,准备创建一个定时器对象

2.2在widget.cpp中

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

    timer = new QTimer;//用来初始化
}
  1. : QWidget(parent), ui(new Ui::Widget)

    • 调用父类QWidget的构造函数
    • 创建UI界面对象
  2. ui->setupUi(this);

    • 设置并显示UI界面
  3. 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 按钮时,该函数会被调用。
  • timer->start(TIMEOUT);

    • timer 是之前初始化的 QTimer 对象(见之前的代码)。

    • start(TIMEOUT) 方法:

      • 启动定时器。
      • 设置超时时间为 TIMEOUT(即 1000 毫秒)。
      • 定时器会每隔 1 秒发出一个 timeout() 信号,可以连接该信号到某个槽函数执行周期性任务。

4.实现第一张图片

  1. 初始化 UI 界面(由 Qt Designer 设计)
  2. 创建一个 QTimer 对象(用于定时任务)
  3. 加载一张图片并显示在 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));
}
  1. Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)

    • QWidget(parent) :调用父类 QWidget 的构造函数,传入父窗口指针 parent(用于窗口层级管理)。
    • ui(new Ui::Widget) :动态创建一个 Ui::Widget 对象(UI 界面类),用于管理界面控件。
  2. ui->setupUi(this);

    • setupUi(this) :加载并初始化 UI 界面(如 .ui 文件定义的布局和控件),并将其附加到当前 Widget 对象。
  3. timer = new QTimer;

    • new QTimer:创建一个 QTimer 对象(定时器),用于在后续代码中执行定时任务(如周期性触发信号)。
  4. 图片加载与显示部分

    • 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;
};
  1. 私有槽函数(private slots)

    • on_startButton_clicked() - 处理开始按钮点击事件
    • timeoutSlot() - 处理定时器超时事件
  2. 私有成员变量(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);
}
  1. 基本结构

    cpp

    connect(发送者, 发送的信号, 接收者, 处理的槽函数);
    
  2. 参数分解

    • timer:信号发送者(QTimer 对象指针)
    • &QTimer::timeout:要连接的信号(定时器超时信号)
    • this:信号接收者(当前 Widget 对象)
    • &Widget::timeoutSlot:接收信号后要执行的槽函数
  3. 信号与槽的特点

    • 当 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()));
}
  1. 核心功能

    QTimer::singleShot(1000, this, SLOT(timeoutSlot()));
    
    • 设置一个只触发一次的定时器
    • 1000毫秒(1秒)后自动执行 timeoutSlot() 槽函数
  2. 参数说明

    • 1000:延迟时间(毫秒)
    • this:接收者对象(当前窗口)
    • SLOT(timeoutSlot()):要执行的槽函数
  3. 与传统定时器的区别

    特性QTimer::singleShot普通 QTimer
    触发次数仅一次循环触发
    内存管理自动释放需手动管理
    适用场景延迟单次操作周期任务
  4. 实际效果

    • 点击按钮后:

      1. 等待1秒钟
      2. 自动执行一次 timeoutSlot()(显示下一张图片)
      3. 定时器自动销毁

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()));
}