在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会尽力在限制范围内工作。

QT定时器QTimer相关推荐

  1. QT 定时器 QTimer 使用

    目录 一.QTimer类使用 1.使用start开启 重复循环定时任务 2.单次延迟任务 3.超时为0的任务 4.一个综合点的例子 The QTimer class provides repetiti ...

  2. Qt学习(七):定时器QTimer

    知识点 Qt中定时器QTimer的使用 完整项目github地址: https://github.com/taw19960426/Qt_study/tree/main/QTimer 结果演示 widg ...

  3. Qt中利用定时器QTimer实时显示当前日期和时间

    Qt中利用定时器QTimer实时显示当前日期和时间 时显示当前日期和时间.下面说明方法: 1. 在工程中声明一个全局QTimer对象 QTimer *timer; 2. 在构造函数中定义QTimer, ...

  4. QT 笔记4 | 资源和图像 目录(QDir)和定时器(QTimer) 鼠标和键盘

    一 资源和图像 1 资源编译器(rcc) 1)创建资源文件(.qrc) eg:<RCC><qresource prefix="/"><file> ...

  5. QT 中QTimer 和 startTimer()的区别

    最需要注意一点 请注意,QTimer的准确性取决于底层操作系统和硬件.timerType参数允许您自定义计时器的准确性.有关不同计时器类型的信息,请参见Qt::TimerType.大多数平台支持20毫 ...

  6. 使用QT定时器遇到的问题

    问题描述: 程序上有槽函数触发频率变化的需求.在使用Qt定时器触发槽函数的过程中发现,每秒钟1000次没有问题,在每秒钟30~50次的情况下出现了延迟. 主体代码如下: std::chrono::ti ...

  7. Qt定时器QBasicTimer、startTimer、QTimer使用总结

    QBasicTimer 这个定时器类是一个 轻量级的.较底层的.被Qt内部使用的定时器类.如果在你的应用程序中使用定时器类,推荐使用QTimer类,而不是这个类.该类和QTimer类类似,也提供sta ...

  8. QT之QTimer详解以及结合多线程中开启定时器的示例

    一 QTimer详解 QTimer类提供了重复和单次触发信号的定时器. a.void timeout ()定时器超时后,这个信号被发射. b.void start()开启定时器,它的重载函数void ...

  9. Qt之QTimer(定时器)

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

最新文章

  1. Python 2.7 学习笔记
  2. 从2D到3D 开发者讲述“街霸V”的美术秘笈
  3. spark实验遇到的问题
  4. 作为一名 ABAP 资深顾问,下一步可以选择哪一门 SAP 技术作为主攻方向?
  5. linux jdk环境变量配置
  6. 操作系统学习(三)-- CPU调度
  7. C++数据结构01--顺序线性表实现
  8. VLOOK Markdown 主题包和增强插件
  9. MyBatis集合Spring(一)之在MyBatis中配置Spring的应用
  10. 搜索python代码的软件_python小说爬虫工具,小说搜索下载软件附源码
  11. 39.Linux清除用户登录记录和命令历史方法
  12. 服务器上Jupyter notebook环境搭建
  13. FlashCC导入使用greensock(TweenLite)包
  14. Windows 下 Apple Mobile Device Support 安装失败导致 iTunes 无法连接分析和解决方案
  15. qemu: usb存储设备仿真
  16. html获取qq高清头像
  17. 基于α-β剪枝算法的智能五子棋
  18. 基于三星ARM9(S3C2410)的交通违章抓拍系统的开发
  19. vue+pdf.js 印章签署完后鼠标滑过显示签章信息
  20. PHP 26个英文字母递增

热门文章

  1. 情人节由来及经典台词
  2. 5g加鸿蒙概念股票,华为鸿蒙系统概念龙头股,无人驾驶最强龙头股
  3. 脚本工具tampermonkey的简单使用
  4. Python数据分析 | DataFrame(数据框)
  5. ffmpeg 之video filter 大全(待整理)
  6. 专升本招生考试应试宝典之计算机基础知识(下)
  7. Kaggle入门——电影案例数据分析
  8. Codeforces Round #FF (Div. 2) B.DYZ Loves Strings
  9. 2021年北京国家高新技术企业认定条件,补贴30万
  10. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04EC20模组SIM卡和驻网模组指令说明