【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 手动区分
功能丰富度 支持暂停、动态修改周期等 功能基础,需手动实现扩展逻辑
适用场景 大多数定时任务 轻量级场景或需要精细控制的情况
相关推荐
weixin_30777913几秒前
Jenkins Branch API插件详解:多分支项目管理的核心引擎
java·运维·开发语言·架构·jenkins
@木辛梓4 分钟前
结构体 结构体c++
开发语言·c++
小股虫6 分钟前
消息中间件关键技术、设计原理与实现架构总纲
java·开发语言·架构
洲星河ZXH8 分钟前
Java,日期时间API
java·开发语言·python
前端老曹9 分钟前
Jspreadsheet CE V5 使用手册(保姆版) 二
开发语言·前端·vue.js·学习
秋邱11 分钟前
AR 定位技术深度解析:从 GPS 到视觉 SLAM 的轻量化实现
开发语言·前端·网络·人工智能·python·html·ar
Boop_wu12 分钟前
[Java EE] 多线程进阶(3) [线程安全集合类]
开发语言·windows·python
雨疏风骤124015 分钟前
【FreeRTOS】任务、任务状态
开发语言·stm32·c#·rtos
SongYuLong的博客19 分钟前
开源 C 标准库(C Library)
c语言·开发语言·开源
木棉知行者20 分钟前
(二)Python基本语句
开发语言·python