【Qt】定时器处理——定时器事件类QTimerEvent和定时器类QTimer使用

这篇具有很好参考价值的文章主要介绍了【Qt】定时器处理——定时器事件类QTimerEvent和定时器类QTimer使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


Qt定时器处理

Qt的定时器只能通过纯代码实现,定时器顾名思义,主要作用是定时特定的时间。
Qt提供了定时器事件类QQTimerEvent和定时器类QTimer实现定时器操作。

定时器QTimer使用

Qt提供了更高层次的定时器编程接口**QTimer**类,可以使用信号和槽,还可以设置定时一次。比较常用的方法有:

  • QTimer::setInterval(timeout):设置定时的时间,单位是ms;
  • QTimer::start():启动定时器;
  • QTimer::timeout():时间到发出信号timeout()
  • QTimer::singleShot():只运行一次的定时器;
  • QTimer::stop():停止定时器

QTimer实现定时器功能大致步骤:

  • 创建定时器对象,QTimer *timer = new QTimer(this);
  • 将定时器的超时信号与自定义的时间更新槽函数连接,也可以使用lambda表达式connect(timer,&QTimer::timeout,this,&MyLCDNumber::timerUpdate);
  • 设置溢出时间,timer->setInterval(1000);
  • 定时器开始定时,timer->start();
  • 需要停止定时器调用timer->stop()即可。
  • 具体代码可参考如下:
MyLCDNumber::MyLCDNumber(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyLCDNumber)
{
    ui->setupUi(this);
    QTimer *timer = new QTimer(this);
    // 关联定时器的超时信号都自定义槽函数中
    connect(timer,&QTimer::timeout,this,&MyLCDNumber::timerUpdate);
    timer->setInterval(1000);
    timer->start(); 
}
void MyLCDNumber::timerUpdate()
{
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm:ss");
    if(time.second() %2 ==0 )  // second()获取秒的值
    {
        text[5] = ' ';  // 每隔1s将:显示为空格
    }
    ui->lcdNumber->display(text);
}

基于Lambda函数的实现方式

基于Lambda函数的实现方式仅绑定信号槽时不同,如下:

connect(m_timer,&QTimer::timeout,this,[=]()
{
	// 处理定时内容
}
);

一次性定时器

实现如下,该种方式特定情况下非常适用,比如防止按钮不小心重复点击或双击时,可以在按钮的点击信号槽函数中使用

QTimer::singleSlot(1000,this,[=]{
// 定时器处理
});

防止按钮重复点击或双击:

ui->pushButton->setEnabled(false);  // 使按钮使能关闭
QTimer::singleSlot(500,this,[=]{
ui->pushButton->setEnabled(true);  // 500ms后按钮使能开启
});

使用QObject内部定时器事件类QTImerEvent,重写定时器事件实现定时器功能

重写定时器事件在需要多个定时器的时候,可以减少系统资源。QtimerEvent类描述了一个定时器事件。

  • QObject的子类可以使用startTimer()可以开启一个定时器,该函数参数单位是毫秒,表示设定的时间,函数返回值表示这个定时器。当定时器到达指定的时间时会进入timerEvent()函数进行需要的操作。
  • 通过函数timerId()可以获取startTimer()返回的定时器。
  • 如果想要停止定时器调用killTimer()即可。

实现步骤:

  1. 头文件声明,重写定时器事件函数timerEvent()

    void timerEvent(QTImerEvent *event);  // 重写定时器事件函数
    int m_timerID;  // 定时器ID
    
  2. 启动定时器startTimer()并返回定时器ID

    m_timerID = startTimer(1000);  // 启动定时1s
    
  3. 处理定时器事件

    void classname::timerEvent(QTimerEvent *event)
    {
    	if(m_timerID == event->timerID())  // 判断定时器ID
    	{
    		// 处理ID为m_timerID的定时器事件
    	}
    	else if(m_timerID2 == event->timerID())
    	{
    		// 处理另一个定时器的事件
    	}
    }
    
  4. 在需要时关闭定时器killTimer()

    killTimer(m_timerID);
    

总结使用QTImerEven实现定时器的操作的步骤:

  1. 使用startTImer()开启一个定时器;
  2. 重写timerEvent()函数;
  3. 需要关闭定时器时调用killTimer()

当需要多个定时器时可以参考如下使用:文章来源地址https://www.toymoban.com/news/detail-446948.html

QList<int> timerIDList;
// ...
for(int i=0;i<100;i++)
	timerIDList.append(startTimer(1000));
// ...

void calssname::timerEvent(QTimerEvent *event)
{
	if(timerIDList.at(0) == event->timerID())
	{
		// 处理当前定时器
	}
	else if(timerIDList.at(0) == event->timerID())
	{
		// 处理当前定时器
	}
	//  ...
}

到了这里,关于【Qt】定时器处理——定时器事件类QTimerEvent和定时器类QTimer使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 定时器/事件

    网页中经常会需要:每隔一段时间需要 自动 执行一段代码,不需要我们手动去触发 ----- 定时器函数 比如:网页中得倒计时 定时器函数有两种: 间隔函数 和 延迟函数 间隔函数 作用:每隔指定的时间 自动重复执行某些代码 定时器函数可以 开启 和 关闭 定时器 开启定时器

    2024年02月11日
    浏览(47)
  • Qt 定时器

    startTimer(); 注意:定时器参数要是全局或者静态变量。   没有结束函数 int timerId=startTimer(); startTimer()返回定时器标志 需设置为类的成员--类内使用 通过定时器事件判断   QTimer类事件间隔到达 QTimer不需要ID,只需要对象不同就可以区别定时器。 start() stop()     timer=new QTimer(thi

    2024年02月09日
    浏览(40)
  • QT学习之定时器

    一、定时器 第一种方式: 1 利用事件 void timerEvent ( QTimerEvent * ev) 2 启动定时器 startTimer( 1000) 毫秒单位 3 timerEvent 的返回值是定时器的唯一标示 可以和ev-timerid 做比较 第二种方式: 1 利用定时器类 QTimer 2 创建定时器对象 QTimer * timer = new QTimer(this) 3 启动定时器 timer-start(毫秒)

    2024年02月16日
    浏览(43)
  • Qt学习(一)-------- 定时器、绘图

    1.定时器 QTimer    ⭐  创建定时器对象  QTimer *timer = new QTimer(this);    ⭐ 启动定时器 timer-start(毫秒);    ⭐ 监听信号 connect(timer,QTimer::timeout,[=](){     }); -----------------------------------------------------------例子-----------------------------------------------------------     ⭐ 点击暂停,实现

    2024年02月03日
    浏览(42)
  • 【QT】时间日期与定时器

    目录 1.时间日期相关的类 2.日期时间数据与字符串之间的转换 2.1 时间、日期编辑器属性设置 2.2 日期时间数据的获取与转换为字符串 2.3 字符串转换为日期时间 3.QCaIendarWidget日历组件 3.1基本属性 3.2 公共函数 3.3 信号 4.实例程序演示时间日期与定时器的使用 时间日期是经常

    2024年02月04日
    浏览(49)
  • 对定时器中影子寄存器以及更新操作和更新事件理解

    本人是stm32初学者,近期在看定时器参考文档时遇到些阻碍,再参考了众多CSDN博主的文章后,得到了一些个人理解,将其发布出来,本文也对一些参考的文章进行了不少复制粘贴同时也在这些文章必要位置加入了个人看法,文章链接附在最后 由于本人是初学者,本文一定存在

    2024年02月05日
    浏览(42)
  • 自定义循环队列、软件定时器、事件集,实用嵌入式代码库

    本篇博文分享一个很实用的嵌入式代码库。 它可灵活应用到有无RTOS的程序中,采用C语言面向对象的思路实现各个功能,尽可能最大化的复用代码,目前为止工具包包含: 循环队列、软件定时器、事件集 。 网址:https://download.csdn.net/download/m0_38106923/87765476?spm=1001.2014.3001.550

    2024年02月03日
    浏览(54)
  • 二、Qt定时器与文本编辑器制作《QT 入门到实战》

    了解 qt 的 pixmap 了解 qt 的 label 如何显示图片 了解定时器的开启 了解定时器的关闭 了解文件如何进行读取 了解 QFileDialog 的使用 了解了一个文本编辑器的基本编写 巩固了 connect 的使用 在 Qt 中使用 Label 可以显示文本,但 Label 不止可以显示文本,还可以用于图片的显示。 首

    2024年02月02日
    浏览(45)
  • VBA中类的解读及应用第八讲:实现定时器功能的自定义类事件

    《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。 类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入,有必要理解这些抽象的理论知识。对象,类,过程,方法

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包