_ZNote_Qt_定时器的总结
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_OBJECT public:
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以内的随机数就得%100
case 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_OBJECT public:
MainWindow(QWidget *parent = );
~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();//定时器开始,1000ms触发一次
timerInt = ;
} 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++ == ){
if(timer ->isActive()){
timer -> stop();//停止运行
}
}
}
_ZNote_Qt_定时器的总结的更多相关文章
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...
- [Java定时器]用Spring Task实现一个简单的定时器.
今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...
- Node+fs+定时器(node-schedule)+MySql
目标:将本人写博客时候的截图保存到桌面的图片 执行保存到指定文件进行整理 并写入数据库 先看最终的目录结构: package.json文件: { "name": "zqz ...
- 深入理解定时器系列第一篇——理解setTimeout和setInterval
× 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...
- 前端开发:setTimeout与setInterval 定时器与异步循环数组
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...
- 转载---javascript 定时器总结
转载:http://www.jb51.net/article/40193.htm JS里设定延时: 使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延 ...
- Node中的定时器详解
在大多数的业务中,我们都会有一些需求,例如几秒钟实现网页的跳转,几分钟对于后台数据进行清理,node与javascript都具有将代码延迟一段时间的能力.在node中可以使用三种方式实现定时功能:超时 ...
- spring定时器,定时器一次执行两次的问题
Spring 定时器 方法一:注解形式 配置文件头加上如下: xmlns:task="http://www.springframework.org/schema/task" htt ...
随机推荐
- 红黑树Python实现
# coding=utf-8 # 红黑树Python实现 # 颜色常量 RED = 0 BLACK = 1 def left_rotate(tree, node): if not node.right ...
- 接口测试工具postman/jmeter基本使用
一.接口的分类: 最常用的两种接口webservice接口和http api接口:1.webservice接口走soap协议通过http传输,请求报文和返回报文都是XML格式,现在测试的时候都通过工具 ...
- 前端--vue框架
1.下载 查看已安装好的版本 -------渐进式的JS框架--------- vue是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架 ...
- Mac 笔记本 开发日记
1.录屏,截图 Mac 自带录屏功能 command +control +o 2.复制当前应用,在启一个当前app窗口 command+n 3.快速回到桌面 command +f3 4.选中文件,复制 ...
- Java中的反射总结
反射是获取运行时类信息,即常量区中的Class信息. 要获取类信息,必然需要依据,不然系统怎么指定你要获取那个类信息, 类信息在java中就是Class类的一个对象,它是一个java类抽象,换句话说它 ...
- redis、mysql、mongdb的比较
特点: 1-1 MySQL:1. 使用c和c++编写,并使用了多种编译器进行测试,保证源代码的可移植性2. 支持多种操作系统3. 为多种编程语言提供可API4. 支持多线程,充分利用CPU资源优化的S ...
- HTML中的Meta标签详解
emta标签的组成:meta标签分两大部分:HTTP-EQUIV和NAME变量. HTTP-EQUIV:HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显 ...
- vue 需求 data中的数据之间的调用
我遇到过这种情况 就是在我的data中 会有数据调用data中的其他数据 如图 我的alertInfoType需要拿到screeningCondition中type的值 用过vue的都知道 我是不 ...
- MySQL数据查询之多表查询
多表查询 多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment PRIMARY KEY, dna ...
- 网络传输 buf 封装 示例代码
网络传输 buf 封装 示例代码 使用boost库 asio // BufferWrapTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h&quo ...