Qt中实现定时器有两种方法.

一种是使用QObject类定时器;一种是使用QTimer类定时器.(定时器的精度依赖于操作系统和硬件,大多数平台支持20ms)

1,QObject类定时器.

通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject::killTimer()结束。 当定时器触发时,应用程序会发送一个QTimerEvent。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。

int QObject::startTimer(int interval);
//开始一个定时器并返回定时器ID,如果不能开始一个定时器,将返回0。
//定时器开始后,每隔interval毫秒间隔将触发一次超时事件,直到killTimer()被调用来删除定时器。
//如果interval为0,那么定时器事件每次发生时没有窗口系统事件处理。

virtual void QObject::timerEvent(QTimerEvent *event);
// 虚函数timerEvent()被重载来实现用户的超时事件处理函数。
// 如果有多个定时器在运行,QTimerEvent::timerId()被用来查找指定定时器,对其进行操作。
// 当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。

void killTimer(int id);
//通过定时器标识符来杀死定时器。

实例:

//  .h #ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_clicked();private:void timerEvent(QTimerEvent *t);Ui::MainWindow *ui;int m_nTimerId1;int m_nTimerId2;int m_nTimerId3;
};#endif // MAINWINDOW_H/ .cpp ///#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCore>
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_nTimerId1 =  startTimer(1000);m_nTimerId2 =  startTimer(5000);m_nTimerId3 =  startTimer(10000);//有教程说直接按照顺序,几个定时器,就返回几.但实际上并不一定这样.
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::timerEvent(QTimerEvent *t)//定时器时间
{int id = t->timerId();qDebug() <<id;if(id == m_nTimerId1) ui->label->setText(tr("每秒产生一个随机数:%1").arg(qrand()%10));if(id == m_nTimerId2) ui->label_2->setText(tr("5秒后软件将关闭"));if(id == m_nTimerId3) qApp->quit();/*switch(t->timerId())//判断定时器的句柄{//qrand(),可以产生随机数//qrand()%10可以产生0~9之间的随机数//要想产生100以内的随机数就得%100case 2:ui->label->setText(tr("每秒产生一个随机数:%1").arg(qrand()%10));break;case 3:ui->label_2->setText(tr("5秒后软件将关闭"));break;case 4:qApp->quit();break;//退出系统}*/
}void MainWindow::on_pushButton_clicked()
{if(m_nTimerId1 != 0)killTimer(m_nTimerId1);if(m_nTimerId2 != 0)killTimer(m_nTimerId2);if(m_nTimerId2 != 0)killTimer(m_nTimerId2);
}

 实现效果:

2,QTimer类实现

QTimer类定时器是QObject类定时器的扩展版或者说升级版,因为它可以提供更多的功能。比如说,它支持单次触发和多次触发。

使用QTimer类定时器的步骤:

(1)创建一个QTimer定时器实例:QTimer *timer = new QTimer(this);
(2)连接超时信号与槽:connect(timer, SIGNAL(timeout()), this, SLOT(testFunc()));
(3)启动定时器start(); 定时器有两种  start(int time)  和  setSingleShot(true)  前者表示重复触发,除非stop关闭. 后者仅仅启动一次.
(4)适时关闭定时器:stop();
(5)删除定时器实例:delete timer;

例如:

/////  .h  //
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtCore>
#include <QMainWindow>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = 0);~MainWindow();private slots:void timerUpdate();
private:QTimer *timer;int timerInt;
};#endif // MAINWINDOW_H///  .cpp   /

#include "mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{timer = new QTimer(this); //新建定时器
connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));//关联定时器计满信号和相应槽函数timer -> start(1000);//定时器开始,1000ms触发一次timerInt = 0;
}MainWindow::~MainWindow()
{}void MainWindow::timerUpdate()
{QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");//设置系统时间显示格式//  ui->label->setText(str);//在标签上显示时间qDebug() << str;if(timerInt++ == 5){if(timer ->isActive()){timer -> stop();//停止运行
        }}
}

 

转载于:https://www.cnblogs.com/zpsoe/p/7080697.html

_ZNote_Qt_定时器的总结相关推荐

  1. 一文吃透JAVA定时器格式

    JAVA 定时器时间格式 ​ 基本格式: [秒]  [分]  [小时]  [日]  [月]  [周]   [年] 序号 说明 是否必填 允许填写的值 允许使用的通配符 1 秒 是 0-59 ,   - ...

  2. Timer定时器开发

    Timer定时器开发 定时器的作用是不占线程的等待一个确定时间,同样通过callback来通知定时器到期. 参考:https://github.com/sogou/workflow 定时器的创建 同样 ...

  3. linux定时器(crontab)实例

    linux实验示例----实现每2分钟将"/etc"下面的文件打包存储到"/usr/lobal"目录下 ·Step1:编辑当前用户的crontab并保存 终端输 ...

  4. c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式

    原标题:单片机C语言编程定时器的几种表达方式 吴鉴鹰单片机开发板地址 店铺:[吴鉴鹰的小铺] 地址:[https://item.taobao.com/item.htm?_u=ukgdp5a7629&a ...

  5. linux 内核按键抖动,Tiny4412 Linux驱动之按键(定时器防抖动) | 技术部落

    按键抖动示意图 我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开.抖动时间由按键的机械特性所决定,一般为5ms~10m ...

  6. mysql 定时器不能持续循环执行_定时器,不循环执行指定方法?如何解决?

    ⁽⁽ଘ你管我管你疯啊ଓ⁾⁾ 01-22 加粗 标红 插入代码 插入链接 插入图片 上传视频 请 登录 后发表内容 关闭 新增或编辑超链接 链接地址 关闭 插入视频 视频链接 messageScroll ...

  7. oracle定时器怎么开启,Oracle的定时器使用示例

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. --Oracle定时job --数据库执行此脚本时时,请确保只执行一次,否则会引发错误! ...

  8. java 定时器获得外部参数_JMeter定时器使用小结

    一.定时器的作用域 1.无论定时器位置在Sampler之前还是下面,定时器是在每个sampler(采样器)之前执行的,而不是之后: 2.当执行一个Sampler之前时,所有当前作用域内的定时器都会被执 ...

  9. PHP 毫秒级定时器,实现php毫秒定时器方法详解

    描述 PHP编程语言是一种快速.简洁的服务端脚本编程语言,可以制作强大的交互性展现.在编程界PHP是完全免费的语言,在程序员身上使用非常的广泛,在编程中是大家高效的选择. PHP能实现的功能 1.可以 ...

最新文章

  1. 我对bgwriter.c 与 guc 关系的初步理解
  2. ♥看二本学渣如何进腾讯 分享面试经验、职场感悟、硬核知识、大厂内推♥
  3. 如何解决:Android中 Error generating final archive: Debug Certificate expired on 的错误
  4. 【Linux】一步一步学Linux——tr命令(55)
  5. python+Tesseract-OCR实现图片识别(只适合新手)
  6. mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...
  7. HDU1434 幸福列车【模拟+优先队列】
  8. 使用doxygen查看文件包含关系图
  9. TCP/IP 选项TcpTimedWaitDelay设置
  10. java string内部实现_Redis知识总结--string的内部实现
  11. 积跬步,聚小流------具有滑动效果的导航
  12. 【Rust日报】2022-07-20 极简主义 Poem 指南
  13. 真的有人能开启上帝视角,所有人在他眼里一览无余?
  14. vue中 根据权限 动态的设置路由
  15. 超神战记不显示服务器,《超神战记》停运公告
  16. 【强化学习】Actor-Critic算法详解
  17. mysql 矩阵运算_HDU 2276 Kiki amp; Little Kiki 2 (位运算+矩阵快速幂)
  18. 方舟生存进化服务器物品叠加,方舟生存进化:“秤砣虽小压千斤”,叠加和解飞一个都不能少!...
  19. 快速学习-视频点播解决方案
  20. android 三星闪退,三星手机升级安卓10微信闪退怎么办?(附解决方法)

热门文章

  1. 把ASCII码的字符串转为数字的16进制
  2. python编译安装pyaudio
  3. 【模拟退火】解决【TSP】问题
  4. 第3周实践项目7 删除链表元素最大值
  5. [YTU]_2417 C语言习题 字符串长度
  6. 三角剖分(delaunay)拓扑结构 高维近邻
  7. distanceTransform函数
  8. Java基础点:集合
  9. redis--Sentinel
  10. UITextView实现PlaceHolder的方式