【Qt】定时器--滚动相册

定时器用于实现定时触发操作,常用于周期性执行任务、延时处理等场景。

定时器可分为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 手动区分
功能丰富度 支持暂停、动态修改周期等 功能基础,需手动实现扩展逻辑
适用场景 大多数定时任务 轻量级场景或需要精细控制的情况
相关推荐
筱砚.4 小时前
【STL——stack容器】
开发语言·c++
沐知全栈开发5 小时前
Java 文档注释
开发语言
程序_白白5 小时前
探讨一下java将来未来两年内的就业以及发展
java·开发语言
哼?~5 小时前
C++之智能指针
开发语言·c++
码农葫芦侠5 小时前
Qt如何翻译JSON内容
qt·json
mjhcsp5 小时前
C++ long long 类型深度解析:大整数处理的基石
开发语言·c++·策略模式·long long
Larry_Yanan5 小时前
QML学习笔记(四十五)QML与C++交互:信号槽的双向实现
c++·笔记·qt·学习·ui·交互
YuanlongWang6 小时前
C# 设计模式——工厂模式
开发语言·设计模式·c#
VB.Net6 小时前
VB.Net循序渐进(第二版)
开发语言·.net·vb.net