当前位置: 首页 > 编程日记 > 正文

Qt中两种定时器用法

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

1.QObject类的定时器

QObject是所有Qt对象的基类,它提供了一个基本的定时器。通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject::killTimer()结束。

当定时器触发时,应用程序会发送一个QTimerEvent。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。

QObject类还提供定时期的功能。与定时器相关的成员函数有:startTimer()、timeEvent()、killTimer()。QObject基类中的startTimer()和timerEvent()原型及说明如下:

intQObject::startTimer(int interval);

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

virtual voidQObject::timerEvent(QTimerEvent *event);

虚函数timerEvent()被重载来实现用户的超时事件处理函数。如果有多个定时器在运行,QTimerEvent::timerId()被用来查找指定定时器,对其进行操作。

当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。

定时器的用法如下:

//头文件

class QNewObject : publicQObject

{

Q_OBJECT

public:

QNewObject( QObject * parent = 0 );

virtual ~QNewObject();

protected:

void timerEvent( QTimerEvent *event );

int m_nTimerId;

};

//源文件

QNewObject::QNewObject(QObject * parent )

:QNewObject( parent )

{

m_nTimerId = startTimer(1000);

}

QNewObject::~QNewObject()

{

if ( m_nTimerId != 0 )

killTimer(m_nTimerId);

}

voidQNewObject::timerEvent( QTimerEvent *event )

{

qDebug( "timer event, id %d",event->timerId() );

}

2.定时器类QTimer

定时器类QTimer提供当定时器触发的时候发射一个信号的定时器,他提供只触发一次的超时事件,通常的使用方法如下:

//创建定时器

QTimer *testTimer = newQTimer(this);

//将定时器超时信号与槽(功能函数)联系起来

connect( testTimer,SIGNAL(timeout()), this, SLOT(testFunction()) );

//开始运行定时器,定时时间间隔为1000ms

testTimer->start(1000);

...

//停止运行定时器

if (testTimer->isActive() )

testTimer->stop();

QTimer还提供了一个简单的只有一次定时的函数singleShot()。 一个定时器在100ms后触发处理函数animateTimeout()并且只触发一次。代码如下:

QTimer::singleShot( 100,this, SLOT(animateTimeout()) );

QTimer类提供了定时器信号和单触发定时器。

它在内部使用定时器事件来提供更通用的定时器。QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

注意当QTimer的父对象被销毁时,它也会被自动销毁。

实例:

QTimer *timer = new QTimer( myObject );

connect( timer, SIGNAL(timeout()),myObject, SLOT(timerDone()) );

timer->start( 2000, TRUE ); // 2秒单触发定时器

你也可以使用静态的singleShot()函数来创建单触发定时器。

作为一个特殊情况,一旦窗口系统事件队列中的所有事件都已经被处理完,一个定时为0的QTimer就会到时间了。

这也可以用来当提供迅速的用户界面时来做比较繁重的工作。

QTimer *t = new QTimer( myObject );

connect( t, SIGNAL(timeout()), SLOT(processOneThing()));

t->start( 0, FALSE );

myObject->processOneThing()将会被重复调用并且应该很快返回(通常在处理一个数据项之后),这样Qt可以把事件传送给窗口部件并且一旦它完成这个工作就停止这个定时器。这是在图形用户界面应用程序中实现繁重的工作的一个典型方法,现在多线程可以在越来越多的平台上使用,并且我们希望无效事件最终被线程替代。

注意QTimer的精确度依赖于底下的操作系统和硬件。绝大多数平台支持20毫秒的精确度,一些平台可以提供更高的。如果Qt不能传送定时器触发所要求的数量,它将会默默地抛弃一些。

另一个使用QTimer的方法是为你的对象调用QObject::startTimer()和在你的类中(当然必须继承QObject)重新实现QObject::timerEvent()事件处理器。缺点是timerEvent()不支持像单触发定时器或信号那样的高级水平。

一些操作系统限制可能用到的定时器的数量,Qt会尽力在限制范围内工作。

相关文章:

有福了,J2EE面试题集锦(附答案)

一、基础问答 1.下面哪些类可以被继承? java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T) 2.抽象类和接口的区别 (1)接口可以被多重…

从零开始学ASP.NET(基础篇)

原作者:蓝鲸出处:5D多媒体 学ASPNET与ASP有区别,这种区别不是语言上的,而是思路上的区别。ASP是纯面向过程的,而ASPNET是完全面向对向的。这种区别使我们在编程的结构设计上要与ASP有很大的不同。 废话少说了&#xff…

2 行代码,将 .NET 执行时间降低 87%!

作者 | STEVE GORDON译者 | 弯月,责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)以下为译文:长期以来,我一直在致力于提高性能,并且努力避免在关键代码路径中进行内存分配。例如…

Ansible基础一Playbook(二)

摘自:http://www.ansible.com.cn/docs/playbooks_intro.htmlHandlers: 在发生改变时执行的操作(当发生改动时)’notify’ actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, ‘notify’ actions …

sendmail服务器案例配置

Linux/UNIX下的老牌邮件服务器。Sendmail作为一种免费的邮件服务器软件,已被广泛的应用于各种服务器中,它在稳定性、可移植性、及确保没有bug等方面具有一定的特色,且可以在网络中搜索到大量的使用资料。 实验拓扑图: 注&#xff…

网页制作的中的一些工具代码

1. οncοntextmenu"window.event.returnvaluefalse" 将彻底屏蔽鼠标右键 <table border οncοntextmenureturn(false)><td>no</table> 可用于Table2. <body onselectstart"return false"> 取消选取、防止复制3. οnpaste"r…

神经网络其实和人一样懒惰,喜欢走捷径......

作者 | Jrn-Henrik Jacobsen, Robert Geirhos, Claudio Michaelis&#xff0c;深度学习研究专家译者 | Arvin&#xff0c;责编 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;以下为译文&#xff1a;人工智能会很快取代放射科医生吗&#xff1f;最近&#xff0c;研究人…

nodejs获取ASP.Net WebAPI(IIS Windows验证)

处理了很多天&#xff0c;终于使用Nodejs可以发出请求至WebAPI&#xff0c;能够正常处理数据了 首先加入npm包 npm install httpntlm 在app.js中加入代码 var httpntlm require(httpntlm); var fs require(fs);var options {url: http://get001.mygroup.com/InstantNoodle_S…

ubb代码转化html代码

ubb代码转化html代码 public static string UbbDecode(string str){str HtmlEncode(str);str Regex.Replace(str, "/[url](?<url>.?)/[/url]", "<a href${url} target_blank>${url}</a>", RegexOptions.Compiled | RegexOptions.Ig…

如何定位EXC_BAD_ACCESS错误 (info malloc-history)

在 iphone 开发中使用内存时&#xff0c;我们经常会遇到 EXC_BAD_ACCESS 的错误。 出现这个错误的原因是我们访问了一个已经被释放掉的对象&#xff0c;如&#xff1a; implementation FeedbackViewController - (void)viewDidLoad {[super viewDidLoad];_scrollView [[UIScro…

一周内咸鱼疯转2.4W次,最终被所有大厂封杀!

&#xff08;含答案&#xff09;所有面试资料及技术好文精选文档都整理到网盘了。Java面试官手册需要加微信免费领取Java面试官手册需要加微信免费领取长按扫码或搜索微信号&#xff1a;gh16670101550&#xff0c;免费领取

java 基础知识三 java变量

1、作用域 {} 包围起来的代码称之为代码块&#xff0c;在块中声明的变量只能在块中使用 2、常量 就是固定不变的量&#xff0c;一旦被定义&#xff0c;它的值就不能再被改变。 3、变量 变量必须在程序中被定义&#xff08;或声明&#xff09;后才能使用&#xff0c;而且为每个变…

打通语言理论和统计NLP,Transformers/GNNs架构能做到吗?

作者 | Chaitanya K. Joshi译者 | 苏本如&#xff0c;责编 | 夕颜来源 | CSDN&#xff08;ID:CSDNnews&#xff09;我的工程师朋友经常问我&#xff1a;图深度学习听起来很棒&#xff0c;但是有没有实际应用呢&#xff1f;虽然图神经网络被用于Pinterest、阿里巴巴和推特的推荐…

艰辛的面向对象

为什么80%的码农都做不了架构师&#xff1f;>>> 所有的操作系统都不是面向对象的。 所有的操作系统都是基于函数的。ANDROID框架里面的好多类也是基于函数的。很多都是静态的方法。这个框架包括两个部分&#xff1a;一是JAVA部分&#xff0c;一是本地类。本地类不…

计算机网络第一课

1.IPv4与IPv6的区别是什么&#xff1f;在windows 7以上系统中&#xff0c;在设置本地IP地址的时候经常会看到同事含有IPV4协议项与IPV6协议项&#xff0c;并不同于以往windows xp系统中仅有TCP/IP协议项&#xff0c;不少朋友都觉得比较奇怪&#xff0c;询问编辑IPv4与IPv6的区别…

常用函数集农历函数

常用函数集农历函数原来是vb代码&#xff0c;重新整理为VB.NET版的&#xff0c;并在VS2003中编译通过Imports System.MathPublic Class UCnCalendarPrivate Structure SolarHolidayStructDim Month As IntegerDim Day As IntegerDim Recess As IntegerDim HolidayName As Strin…

微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣

来源 | 微软研究院AI头条编者按&#xff1a;代码智能&#xff08;code intelligence&#xff09;目的是让计算机具备理解和生成代码的能力&#xff0c;并利用编程语言知识和上下文进行推理&#xff0c;支持代码检索、补全、翻译、纠错、问答等场景。以深度学习为代表的人工智能…

Spring从菜鸟到高手(四)(上)使用JdbcTemplate类实现用户登陆验证、批量更新

标签&#xff1a;Spring java JdbcTemplate Spring从菜鸟到高手 绝缘材料原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tonyaction.blog.51cto.com/227462/42042看了我前面几篇文章的朋…

CSS盒模型及边距问题

盒模型是CSS的基石之一&#xff0c;页面的每一个元素都被看作一个矩形框&#xff0c;分别由外边距&#xff0c;边框&#xff0c;内边距&#xff0c;内容组成&#xff0c; 在CSS中&#xff0c;width和height的值指的是内容的宽高&#xff0c;增加外边距&#xff0c;边框&#xf…

区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets

首先&#xff0c;这两个函数不是C标准库中的函数&#xff0c; int getch(void) //从标准输入读入一个字符&#xff0c;当你用键盘输入的时候&#xff0c;屏幕不显示你所输入的字符。也就是&#xff0c;不带回显。 int getche(void) //从标准输入读入一个字符&…

无限想象空间,用Python玩转3D人体姿态估计

前言姿态估计&#xff0c;一直是近几年的研究热点。它就是根据画面&#xff0c;捕捉人体的运动姿态&#xff0c;比如 2D 姿态估计&#xff1a;再比如 3D 姿态估计&#xff1a;看着好玩&#xff0c;那这玩应有啥用呢&#xff1f;自动驾驶&#xff0c;大家应该都不陌生&#xff0…

Mac中将delete键定义为删除键

在Mac中&#xff0c;delete键实际是退格键&#xff08;Backspace&#xff09;&#xff0c;fndelete才是删除键。这也是从Windows转到Mac时不习惯的地方之一。 通过安装DoubleCommand软件可以解决这个问题。安装后&#xff0c;在System Preferences中找到DoubleCommand找打开在E…

CHIL-SQL-MIN() 函数

MIN() 函数 MIN 函数返回一列中的最小值。NULL 值不包括在计算中。 SQL MIN() 语法 SELECT MIN(column_name) FROM table_name 注释&#xff1a;MIN 和 MAX 也可用于文本列&#xff0c;以获得按字母顺序排列的最高或最低值。 SQL MIN() 实例 我们拥有下面这个 "Orders&quo…

Google排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风

毋庸置疑&#xff0c;Python越来越被认可为程序员新时代的风口语言。无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 所以&#xff0c;很多程序员把Python当做第一语言来学习。 但对于Python…

CSS滤镜详解

CSS滤镜详解 简介〓 设置文字透明层次&#xff0c;模糊效果&#xff0c;给文字加光晕等这些本来要靠图片才能处理的效果&#xff0c;现在CSS可以既简单又快速的把它实现了……接着往下看就知道了。 〓正文〓 语法&#xff1a;STYLE"filter:filtername(fparameter1, fpa…

php实现单链表

<?php //单链表的存储结构 class Node{ public $data;//数据域 public $next;//指针域 指向下一个结点 function __construct(){ $this->data null; $this->next null; } } //单链表数据类型 class LinkList{ public $data; public $next; function _…

2017-2-23 C#基础 中间变量

用中间变量做这个题 1、“请输入年份&#xff1a;”&#xff08;1-9999&#xff09; “请输入月份&#xff1a;”&#xff08;1-12&#xff09; “请输入日期&#xff1a;”&#xff08;要判断大小月&#xff0c;判断闰年&#xff09; 判断输入的时间日期是否正确 2、计算输入的…

HTA的简单应用

HTA简介&#xff1a;HTA是HTML Application的缩写&#xff08;HTML应用程序&#xff09;&#xff0c;是软件开发的新概念&#xff0c;直接将HTML保存成HTA的格式&#xff0c;就是一个独立的应用软件&#xff0c;与VB、C等程序语言所设计的软件没什么差别。下面是一个HTA的例子&…

300亿美元,AMD为什么要买Xilinx?

作者 | Just来源 | CSDN(ID:CSDNnews)自2015年5月&#xff0c;Intel&#xff08;英特尔&#xff09;以167亿美元收购FPGA生产商Altera后&#xff0c;半导体行业接连传出大整合。上个月&#xff0c;NVIDIA&#xff08;英伟达&#xff09;宣布以400亿美元收购芯片设计公司Arm&…

PIM-SSM简介

源特定组播(SSM&#xff1a;Source Specific Multicast)是一种区别于传统组播的新的业务模型&#xff0c;它使用组播组地址和组播源地址同时来标识一个组播会话&#xff0c;而不是向传统的组播服务那样只使用组播组地址来标识一个组播会话。SSM保留了传统PIM-SM模式中的主机显示…