【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 手动区分
功能丰富度 支持暂停、动态修改周期等 功能基础,需手动实现扩展逻辑
适用场景 大多数定时任务 轻量级场景或需要精细控制的情况
相关推荐
我材不敲代码16 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
身如柳絮随风扬17 小时前
Java中的CAS机制详解
java·开发语言
韩立学长18 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
froginwe1119 小时前
Scala 循环
开发语言
m0_7066532319 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你9119 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu19 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain
qq_4232339019 小时前
C++与Python混合编程实战
开发语言·c++·算法
m0_7155753420 小时前
分布式任务调度系统
开发语言·c++·算法
csbysj202020 小时前
选择(Selectable)
开发语言