【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 手动区分
功能丰富度 支持暂停、动态修改周期等 功能基础,需手动实现扩展逻辑
适用场景 大多数定时任务 轻量级场景或需要精细控制的情况
相关推荐
py小王子28 分钟前
dy评论数据爬取实战:基于DrissionPage的自动化采集方案
大数据·开发语言·python·毕业设计
小陶的学习笔记34 分钟前
python~基础
开发语言·python·学习
lsx20240639 分钟前
JavaScript 条件语句
开发语言
玄同76540 分钟前
Python 自动发送邮件实战:用 QQ/163 邮箱发送大模型生成的内容
开发语言·人工智能·python·深度学习·机器学习·邮件·邮箱
索荣荣42 分钟前
Maven配置文件(pom.xml)终极指南
java·开发语言
钟智强1 小时前
React2Shell:CVE-2025-66478 Next.js 远程执行漏洞深度分析与代码剖析
开发语言·javascript·ecmascript
数研小生1 小时前
Python自然语言处理:NLTK与Gensim库
开发语言·python·自然语言处理
第七序章1 小时前
【Linux学习笔记】初识Linux —— 理解gcc编译器
linux·运维·服务器·开发语言·人工智能·笔记·学习
消失的旧时光-19431 小时前
C++ 拷贝构造、拷贝赋值、移动构造、移动赋值 —— 四大对象语义完全梳理
开发语言·c++
送秋三十五1 小时前
一次大文件处理性能优化实录————Java 优化过程
java·开发语言·性能优化