Qobject定时器
目标
本小节将通过qobject定时器,实现一个不断刷新图片的功能
1.start按钮点击每隔一秒刷新图片
2.stop按钮暂停播放
start按钮实现
1. 创建一个ui界面,如图所示

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

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

4. 创建图片对象
- 先去
widget.h声明一个int pixid变量 - 在
构造函数中先显示一个图片

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. 信号与槽
-
先去
widget.h下声明一个void timeoutslot()函数 -
编写
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 实例自由管理 |
| 推荐程度 | 适合简单或系统底层用途 | ✅ 推荐日常开发中使用 |
755

被折叠的 条评论
为什么被折叠?



