QT 学习及实操 - QTimer 计时器的自动图片展示

11490DX Re: Master Lv.15

文中知识点包含计时器、随机数生成器、显示图片等。

介绍 - QTimer

首先 #include <QTimer>

QTimer 是一个 QT 自带的计时器,可以在给定的秒数后发出信号。

  • 声明变量:QTimer timer;
  • 声明指针并初始化:QTimer *timer; timer = new QTimer;(这个程序中我使用的这一种来声明)
  • 启动并且每 秒发送一次信号:timer->start(x);
  • 启动并且 秒后发送信号后停止:timer->singleShot(x, receiver, &Slotfunction),其中 receiver&Slotfunction 分别为接收者和发送信息到的槽函数。
  • 停止:timer->stop();
  • 检查是否在工作:timer->isActive(),返回布尔值。

QTimer 连接信号和槽函数的一例:connect(timer, &QTimer::timeout, receiver, &Class::Slotfunction);

基于这个就可以写一个自动展示画面的工具了。

介绍 - 其它

当然还有一些其他东西才可以制作这个软件。

注意到图片是要展示在 Label 上的。要在 Label 上显示图片(该 Label 的对象名为 pictureDisplay),可以使用 QImage 功能:

1
2
3
QImage curImage;
curImage.load(":/images/tofsox.png");
ui->pictureDisplay->setPixmap(QPixmap::fromImage(curImage));

这里为了能够更好地迁移就将所有图片全部加进了 Resources 里面了。这个是极好的,路径查找也很方便。


由于一些神秘原因,我会展示一些随机的彩蛋图片。我希望在展示这些彩蛋图片的时候随机一个编号。这时就可以使用 QRandomGenerator 来生成随机数。

  • 声明指针并初始化:QRandomGenerator rand; rand = new QRandomGenerator;
  • 设定基于当前时间的种子:rand->seed(QTime::currentTime().msec());
  • 随机 的一个整数:int num = rand->bounded(a, b+1);(为什么是 b+1?)

哦哦,查了一下资料,我知道了:

quint32 QRandomGenerator::bounded(quint32 lowest, quint32 highest)

Generates one random 32-bit quantity in the range between lowest (inclusive) and highest (exclusive). The highest parameter must be greater than lowest.

也就是说,它生成一个随机数的范围本来就是 !!!我不好评价。

自动图片展示程序设计

UI

逻辑部分

首先,现在 widget.h 里面的 private 里面把你想定义的全局变量给定义了。

然后设置默认界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QImage defaultImage;
defaultImage.load(":/images/default.png");
ui->pictureDisplay->setPixmap(QPixmap::fromImage(defaultImage));
ui->indexDisplay->setText("0/"+QString::number(LIM+1));
ui->indexDisplay->setAlignment(Qt::AlignRight);
timer = new QTimer;
imgidx = 0;
rand = new QRandomGenerator;
rand->seed(QTime::currentTime().msec());
connect(timer, &QTimer::timeout, this, &Widget::timerTimeout);
}

然后写一个 void Widget::timerTimeout() 函数,为了能够在每一次收到信号之后切换图片。

1
2
3
4
5
6
void Widget::timerTimeout(){
QImage cur; cur.load(":/images/"+QString::number(imgidx)+".png");
ui->pictureDisplay->setPixmap(QPixmap::fromImage(cur));
ui->indexDisplay->setText(QString::number(imgidx+1)+"/"+QString::number(LIM+1));
imgidx = (imgidx == LIM? 0: imgidx+1);
}

最后就是写槽函数了。这个是最好写的。

后记

今天下午 5 点过的时候,因为机房外面似乎是 VERTeX 被召唤过来了,外面电闪雷鸣,倾盆大雨,风都要把树吹倒了,于是我觉得我是一时半会我是出不去了,所以就在机房里面把这篇给学了。自我感觉良好。

工程源文件 最终程序

是时候该回去了。

  • Title: QT 学习及实操 - QTimer 计时器的自动图片展示
  • Author: 11490DX
  • Created at : 2025-07-29 20:14:53
  • Updated at : 2025-07-29 20:50:35
  • Link: https://11490dx.net/2025/07/29/QT-R70729/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
QT 学习及实操 - QTimer 计时器的自动图片展示