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. 配置postfix+dovecot+mysql+postfixadmin+squirrelmail 邮件系统笔记
  2. Android应用--简、美音乐播放器增加音量控制
  3. 如何阻止 AcrobatPro DC自动更新升级?
  4. spring与jpa整合 简化persistence.xml配置文件 使用属性文件 数据源dbcp访问数据库...
  5. 为什么写网页用php,php能写网页吗
  6. 查看/统计 代码行数
  7. 维融高拍仪驱动通用_动态展示和教学 良田YL1050AF高拍仪评测
  8. 计算机应用基础的课程讨论,(计算机教学论文:计算机应用基础课程教学方法的讨论.doc...
  9. Lead项目中简单分析卡号的编码规则
  10. 聚焦云+人工智能,纳德拉宣布微软重大重组
  11. 《谷物大脑》书中的精髓:如何通过四星期行动计划打造健康身体?
  12. 整理了300个市面上最不常见的springboot计算机毕业设计选题。满满的干货
  13. PostgreSQL开发规范
  14. 采用ASP.NET使用C#.NET语言开发的在线学生选课系统(源码+数据库+论文)
  15. php kibana查询,Kibana+Logstash+Elasticsearch 日志查询系统搭建
  16. 新建安卓项目找不到R文件?——绝对零度试验机
  17. 博客大巴,自动登录,并发布信息开发小计。
  18. HP-SuperDome MP收集日志
  19. 图解http知识图谱
  20. fullCalendar日历,点击添加日程,点击删除日程

热门文章

  1. python设置笔记本屏幕背光亮度
  2. 信息安全规范及使用场景
  3. html5 气泡,【HTML5CSS3进阶学习01】气泡组件的实现
  4. 用Flair(PyTorch构建的NLP开发包)进行文本分类
  5. 下一代前端语言之争,JavaScript 要被新语言反超?
  6. 批量替换任意文件扩展名(格式后缀),如ppt变pptx,docx变doc
  7. X Window 的奥秘
  8. Vue3 预览图片和视频
  9. 李宁公司正式发布“李宁䨻”轻弹科技平台
  10. Adversarial Attack (对抗攻击)