《Qt 定时器——QObject and QTimer》

Qobject定时器


目标

本小节将通过qobject定时器,实现一个不断刷新图片的功能

1.start按钮点击每隔一秒刷新图片
2.stop按钮暂停播放

start按钮实现


1. 创建一个ui界面,如图所示

在这里插入图片描述


2. 写入一个虚函数重写和一个id变量,同时在widget.h加入一个宏定义#define timout 1*1000
在这里插入图片描述

3. 编写startbutton槽函数以及虚函数编写

在这里插入图片描述

4. 创建图片对象

  1. 先去widget.h声明一个int pixid 变量
  2. 构造函数中先显示一个图片

在这里插入图片描述

5. 切换图片功能

开始之后不断刷新的代码进行编写
在这里插入图片描述

编译之后能正常运行

stop按钮实现

这个很简单就一段代码

void Widget::on_stopbutton_clicked()
{
    this->killTimer(myid);
}


完整代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#define timout 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();

private slots:
    void on_startbutton_clicked();

private:
    Ui::Widget *ui;
    int myid;
    int pixid;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    pixid=1;
    QPixmap pix("/home/yunes/qtp/objectTimer/1.png");
    ui->label->setPixmap(pix);
}
Widget::~Widget()
{
    delete ui;
}


void Widget::on_startbutton_clicked()
{
    //开启定时器,返回定时器编号
    myid=this->startTimer(timout);
}

void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId()!=myid)
    {
        return;
    }
   QString path("/home/yunes/qtp/objectTimer/");
   path=path+QString::number(pixid)+".png";
   QPixmap pix(path);
   ui->label->setPixmap(pix);
   pixid++;
   if(pixid>3)
       pixid=1;
}

Qtimer定时器

这里我们同样实现跟上面一样的效果

start按钮实现


1.widget.h类中导入<QTimer>,再定义一个,并创建一个QTimer对象

在这里插入图片描述


2. 初始化qtimer,并编写startbutton槽函数

在这里插入图片描述


3. 创建图片对象,并显示

在这里插入图片描述


4. 信号与槽

  1. 先去widget.h下声明一个void timeoutslot()函数

  2. 编写connect()

    在这里插入图片描述


5. 图片切换功能

开始之后不断刷新的代码进行编写

方法基本相似

在这里插入图片描述


stop按钮实现

一段代码秒杀
在这里插入图片描述

完整代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>
#define timout 1*1000

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();
    void timeoutslot();

    void on_stopbutton_clicked();

private:
    Ui::Widget *ui;
    QTimer * qtimer;
    int picid;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    qtimer=new QTimer;
    QImage img;
    picid=2;
    img.load("/home/yunes/qtp/qtimer/1.png");
    ui->label->setPixmap(QPixmap::fromImage(img));
    //定时器时间到,发出timeout信号
    //谁发出,发出什么,谁处理,怎么处理
    connect(qtimer,&QTimer::timeout,this,&Widget::timeoutslot);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_startbutton_clicked()
{
    qtimer->start(timout);

}
void Widget::timeoutslot()
{
    QString path("/home/yunes/qtp/qtimer/");
    path=path+QString::number(picid)+".png";
    picid++;
    if(picid>3)
        picid=1;
    QImage img;
    img.load(path);
    ui->label->setPixmap(QPixmap::fromImage(img));

}

void Widget::on_stopbutton_clicked()
{
    qtimer->stop();
}



对比

总结对比

特性QObject::startTimer()QTimer
触发方式重写 timerEvent()发出 timeout() 信号
是否用 connect()❌ 不需要✅ 需要
多定时器管理要手动判断 timerId()可以多个 QTimer 实例自由管理
推荐程度适合简单或系统底层用途✅ 推荐日常开发中使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值