QTimer类为我们提供了一个即可重复触发又可单次触发的定时器。它是一个高层次的应用程序接口。要使用它,只需创建一个QTimer类对象,将它的timeout()信号连接到适当的函数上,然后调用其start()函数开启定时器即可,此后,QTimer对象就会周期性的发出timeout()信号。

例如,一个1s执行一次的定时器,可以如下设置:

      QTimer *timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(update()));timer->start(1000);

这样,update()就会每隔1秒被调用一次。

当然,我们也可以让一个QTimer对象在启动后只触发一次,只需调用该类的setSingleShot(true)即可。其实,更简单的做法是使用该类的静态方法QTimer::singleShot(),以某个时间间隔来启动一个单次触发的定时器。例如:

QTimer::singleShot(2000, this, SLOT(updateCaption()));

上面这句代码执行结束,2s后会调用一次updateCaption(),并且只调用一次。

要注意的是在多线程程序中,我们可以在任何开启了事件循环的线程中启动定时器。而要在一个非GUI线程中开启事件循环,则需要调用QThread::exec()。而Qt会使用定时器的线程依附性来决定由哪个线程发出timeout()信号。鉴于此,必须在定时器对象所在的线程中开启和结束定时器,不能跨线程操作。

比较特殊的一点是,在构建QTimer 对象时,可以传入0作为时间间隔。这样的定时器会在窗口系统的事件队列中的事件都被处理完之后触发。这可以用来在GUI程序中处理一些后台任务,比如垃圾收集。

下面我们使用QTimer类,来周期性的改变窗口的背景图片。

新建一个GUI工程Timer,完成后,在工程上点击右键,添加新文件,选中Qt Resource File,将我们需要的图片作为资源加入到工程中。如下图:

点击 Choose,在为资源文件起一个名字即可。如下图:

点击 下一步,在点击完成即可。

完成后,会在工程目录中生成一个资源目录,如下图:

然后,在res.qrc上,右键->open in editor,打开资源编辑器。如下图:

点击 添加->添加前缀,添加一个简单的前缀即可,一般在 前缀 那一栏填入"/"即可。

在点击 添加->添加文件 ,将准备好的图片添加进来即可。添加完成后,如下图:

这样,我们就可以在代码中使用这些图片了。至于Qt的资源系统,大家有时间的话可以自行参考Qt帮助文档学习,此处就不展开讲了。

先来看头文件widget.h的代码:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTimer>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected:void paintEvent(QPaintEvent*);private slots:void timeout();private:Ui::Widget *ui;QTimer* timer;QImage images[12];int index;
};#endif // WIDGET_H

在头文件中,我们先重写了paintEvent()事件,该事件就是用来重绘窗口的,我们以会就是在这个函数中向界面上绘制我们的图片。然后我们还定义了一个timeout()槽函数,该函数用来响应定时器QTimer的timeout()信号(注意,不要和上面的timeout()搞混,一个是槽,一个是信号,此处只是名字而已,大家在可以将上面的槽函数timeout()改为其他的名字)。最后,我们定义了一个定时器对象,一个QImage图片数组,用来存储我们的12张星座图片,还定义了一个index下标,用来在每次界面重绘的事件中标识不同的图片。

下面来看一个窗口的构造函数:

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);images[0] = QImage(":/images/1.jpg");images[1] = QImage(":/images/2.jpg");images[2] = QImage(":/images/3.jpg");images[3] = QImage(":/images/4.jpg");images[4] = QImage(":/images/5.jpg");images[5] = QImage(":/images/6.jpg");images[6] = QImage(":/images/7.jpg");images[7] = QImage(":/images/8.jpg");images[8] = QImage(":/images/9.jpg");images[9] = QImage(":/images/10.jpg");images[10] = QImage(":/images/11.jpg");images[11] = QImage(":/images/12.jpg");index = 0;timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));timer->start(1000);
}

在构造函数中,我们先使用我们添加的资源图片初始化了我们的图片数组,注意Qt中使用资源加载图片的方式,已":"开始,后面是图片在资源文件中的具体路径。然后,将index初始化为0,即重第一张图片开始显示。最后,实例化定时器对象,连接其timeout()信号到我们定义的timeout()槽函数上,再以1s为间隔启动定时器。

timeout()槽函数实现如下:

void Widget::timeout()
{update();
}

在定时器到期函数中,我们只是简单的调用了QWidget类的update()函数,该函数会触发窗口的重绘,即会触发paintEvent()函数的调用。

paintEvent()实现如下:

void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.drawImage(rect(), images[index++ % 12]);
}

在paintEvent()函数中,我们每次将下标index % 12 表示的图片绘制到窗口上,然后将index自增。从而实现12张图片的轮播。

启动程序,运行结果如下,12张星座图片以1s为间隔,不断在窗口中轮播:

QTimer 定时器相关推荐

  1. QObject::startTimer: Timers cannot be started from another thread [使用自定义信号与曹函数来解决在子线程中不能调用QTimer定时器]

    使用自定义信号与曹函数来解决在子线程中不能调用QTimer定时器 报错: QObject::startTimer: Timers cannot be started from another thre ...

  2. QTimer定时器的使用,判断ros是否关闭,ros关闭后关闭窗口

    QTimer定时器的使用,判断ros是否关闭,ros关闭后关闭窗口 c++ #include <QApplication> #include <ros/ros.h> #incl ...

  3. 2.6.4 Qtimer定时器介绍

    2.6.4 Qtimer定时器介绍 QTimer类提供了定时器功能,在指定的时间超时之后可以发出超时信号,可以单次或者重复定时. QTimer使用方法比较简单:先创建一个QTimer定时器,使用sta ...

  4. QTimer定时器问题分析

    QObject::killTimer: timers cannot be stopped from another thread 原因:出现这个错误的原因在于在次线程中执行主线程对象的一些操作引起的 ...

  5. QT QTimer定时器显示系统时间倒计时功能

    QT定时器显示系统时间倒计时功能 lcdNumber控件显示 QTimer::singleShot(10000,this,&MainWindow6_6::close);//10秒后窗口自动关闭 ...

  6. Qt之QTimer(定时器)

    QTimer在界面中不可见,在UI设计器中也找不到它,只能通过纯代码实现,主要作用是定时特定的时间. 想要掌握QTimer只需掌握setInterval(设置定时时间,单位ms).start(启动定时 ...

  7. Qt QTimer定时器

    1.QTimer简介 QTimer 主要的属性是 interval,是定时中断的周期,单位毫秒.QTimer 主要的信号是 timeout(),在定时中断时发射此信号,要想在定时中断里做出响应,这就需 ...

  8. QT定时器QTimer

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. 1.QObject类的定时器 QObj ...

  9. Qt中两种定时器用法

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. 1.QObject类的定时器 QObj ...

最新文章

  1. [转帖]oracle改版sql server问题点汇总
  2. 【Laravel】使用mews/captcha验证码图片不显示,报错 Call to undefined function Intervention\Image\Gd\imagettfbbox()
  3. HDOJ-3790-最短路径问题 解题报告
  4. Vscode 用Filter Line看日志,很爽
  5. Uformer: A General U-Shaped Transformerfor Image Restoration
  6. python下载numpy库_安装numpy库
  7. python决策树分类案例_银行产品销售案例与决策树分类算法
  8. 4种字符串匹配算法:有限自动机(中)
  9. php万能表单制作教程,万能表单系统
  10. ITU-R BT601/BT709 BT656/BT1120区别与联系
  11. IPv6下一代互联网现在就出发!
  12. 传奇开服技术服务端各文件代表着什么意思
  13. 计算机开机没有显示是什么原因是什么情况,电脑开机后显示器没有反应解决方法...
  14. 开源在线客服系统源码(支持PC/H5/公众号/小程序)基于golang的网页在线客服系统...
  15. 查看lv大小 linux,扩展AIX上的LV大小
  16. 计算机一级outlook百度云,Outlook2010官方版
  17. 女生,你也可以IT!
  18. 告诉你1年读100本书的方法
  19. IPsec VPN IKE方式协商密钥
  20. [NISACTF 2022]checkin

热门文章

  1. Unity最佳实践-场景照明
  2. Qt线程同步的几种方法
  3. 使用matlab脚本文件处理excel数据
  4. opencv_角点算法
  5. 进化生物学课后题答案
  6. 关于APP在小米5s第一次安装启动后,点击home返回桌面,再次进入重进闪屏页问题...
  7. 获取Hub集线器实例的方式
  8. Control-模型预测控制(Model Predict Control,MPC)
  9. 《龙的传人》问世40年 原唱:两岸多了解才更友善
  10. modprobe和insmod之间的区别,rmmod和lsmod介绍