【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 手动区分
功能丰富度 支持暂停、动态修改周期等 功能基础,需手动实现扩展逻辑
适用场景 大多数定时任务 轻量级场景或需要精细控制的情况
相关推荐
Evand J13 分钟前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥35 分钟前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk55536 分钟前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python
yurenpai(27届找实习中)43 分钟前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
shmily麻瓜小菜鸡1 小时前
JS/TS 易踩坑知识点 — 模块化与工程化类
开发语言·javascript·ecmascript
geovindu1 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
郝学胜-神的一滴2 小时前
C++11 工程级应用 09:告别无谓拷贝,解锁高性能移动语义
开发语言·数据结构·c++·vscode·软件工程·visual studio
MC皮蛋侠客3 小时前
OPC UA 系列(一):标准全景与 Python 最小闭环——让第一条设备数据流动起来
开发语言·python·opcua
SamChan903 小时前
PDF翻译后的格式完整性校验:用Python自动比对译文与原文档的表格与段落结构
开发语言·python·ai·pdf·机器翻译
君顾14 小时前
外卖CPS系统开发实战指南:从架构设计到部署全流程解析
java·开发语言·外卖