QT里用QObject实现定时器

这里用一个可以按一秒中定时,每一秒更换一张图片的这个项目为例。该项目带有“开始”和“暂停”按钮:

  1. 按下“开始”按钮:启用定时器,图片开始按 1 秒钟定时轮流更换。
  2. 按下“暂停”按钮:图片暂停。

image
效果如图所示.

void Widget::on_startbutton_clicked()
{
//开启定时器,并返回这个定时器的编号。
mytimerid=this->startTimer(timeout);
}
第一个函数是开始定时器的函数,它和开始按钮信号进行连接。开始按钮点击后,信号转到这个函数槽执行。这个函数里面只有一行代码,就是开启这个定时器。

void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()!=mytimerid)
return;
QString path("E:\z3\picture\");
path+=QString::number(currentid);
path+=".png";

QPixmap pix(path);
ui->label->setPixmap(pix);
currentid++;
if(currentid==4)

}
第二个函数就是你点了开始按钮,定时器开始定时后需要做的事情。首先,if 函数判断当前定时器是否是我们开启的定时器。如果不是,就 return 返回出整个大函数之外。如果这个定时器是我们的定时器ID,就跳过if,执行下面的语句。首先我们把图片的地址拆分掉,先定义一个path路径的一个字符串,这个字符串先固定前面一大部分。这个picture文件夹里面有好几张照片,每个照片我们先按数字123456进行排列,每张图片的一个后缀是一样的。所以我们定义path这个路径,前面一段路径是固定的。我们需要把文件名加入到 path 这个路径里面。由于我们每一秒需要换一张图片,文件名是需要改变的,每个文件名的数字都要加 1。所以,我们对这个 pass 路径加等于,就是把这个路径给连上。

由于我们当时定义的定时器开启后,第一个展示图是第二张图 这里定义一个变量:current ID。这里我们 current ID 设置成了 2,是在主函数里设置的,这里没有展示。此时,我们路径里面第二个文件的名字已经复制到这个路径里面了,剩下就是文件名的后缀,我们再次用 path += 。赋值到 pass 路径里面,就构成了一个完整的路径。然后用 QPixmap 函数构建一个路径,这个函数是用来在 Label 控件里面展示图片的。这句话的意思是:

  1. 创建一个 QPixmap 类型的 pix 变量;
  2. 将刚刚创建好的 path 完整路径传到这个 pix 变量里面;
  3. 然后使用 UI 控件 Label 的 setPixmap 方法,填入完整的路径即可。此时,label 上就可以展示 pass 路径里的图片了。

由于定时器每执行一次,它就展示一次;执行完成之后,定时器第二次启动时需要展示下一幅图片。所以我们需要对文件名字进行累加,在这行代码后面需要对 currentID 加 1。完整执行一遍之后,下一次定时器启动,currentID 就是第 3 张图片,以此类推,再下次定时器启动就是第 4 张图片,这样就可以形成每秒换一张图片的效果。

当然,如果你的图片数量有限,可以在后面继续加一个 if 判断:如果当前的 currentID 等于图片数量的上限,就直接把 currentID 赋值成最小值,让它从头进行加载。比如我这里只有 3 张图片,当 currentID=4 的时候,我们就让 currentID 跳回第一张图片,也就是执行 currentID=1。

void Widget::on_pushButton_2_clicked()
{
this->killTimer(mytimerid);
}
这是第三个函数,也就是我们效果图片里面的暂停按钮的功能函数槽。

当我们点击暂停按钮时,信号会通过按钮跳到这个函数槽里,执行这个函数。这里只有一行代码,使用的是 killTimer 函数。你只需要传入指定的计时器 ID,就可以杀死当前这个计时器。

计时器被杀死之后,它就会暂停更换图片,从而达到我们完整的预期效果。

posted @ 2026-07-16 11:33  Modernization  阅读(9)  评论(0)    收藏  举报