Qt定时器类QTimer

参考原文链接:https://blog.csdn.net/weixin_43780415/article/details/131389737

 Qt定时器类QTimer是一个用于重复执行或延迟执行函数的类。它可以在一定时间间隔内发送一个信号,也可以在指定的时间后发送一个信号。QTimer是一个基于事件的定时器,即它使用Qt的事件循环来触发定时器事件。

        要使用它,只需创建一个QTimer类对象,然后调用其 start() 函数开启定时器,此后QTimer对象就会周期性的发出 timeout() 信号。我们先来了解一下这个类的相关API。

以下是QTimer常用的函数:

QTimer(int interval, QObject * parent = nullptr)//构造函数,创建一个新的QTimer对象,间隔时间由`interval`指定。`parent`参数可以设置QObject的父对象。
start(int msec = 0)// 启动or重新启动计时器。
stop()// 停止计时器。
setInterval(int interval)// 设置计时间隔。
setSingleShot(bool singleShot)// 设置计时器方式,若参数`singleShot`为`true`,则定时器只会在定时时间间隔到达时发出一次timeout()信号,否则定时器会一直重复发出timeout()信号。
timerId() const// 返回此计时器的标识符。
isActive() const// 返回计时器是否处于活动状态

public/slot function

// 构造函数
// 如果指定了父对象, 创建的堆内存可以自动析构
QTimer::QTimer(QObject *parent = nullptr);// 设置定时器时间间隔为 msec 毫秒
// 默认值是0,一旦窗口系统事件队列中的所有事件都已经被处理完,一个时间间隔为0的QTimer就会触发
void QTimer::setInterval(int msec);
// 获取定时器的时间间隔, 返回值单位: 毫秒
int QTimer::interval() const;// 根据指定的时间间隔启动或者重启定时器, 需要调用 setInterval() 设置时间间隔
[slot] void QTimer::start();
// 启动或重新启动定时器,超时间隔为msec毫秒。
[slot] void QTimer::start(int msec);
// 停止定时器。
[slot] void QTimer::stop();// 设置定时器精度
/*
参数: - Qt::PreciseTimer -> 精确的精度, 毫秒级- Qt::CoarseTimer  -> 粗糙的精度, 和1毫秒的误差在5%的范围内, 默认精度- Qt::VeryCoarseTimer -> 非常粗糙的精度, 精度在1秒左右
*/
void QTimer::setTimerType(Qt::TimerType atype);
Qt::TimerType QTimer::timerType() const;    // 获取当前定时器的精度// 如果定时器正在运行,返回true; 否则返回false。
bool QTimer::isActive() const;// 判断定时器是否只触发一次
bool QTimer::isSingleShot() const;
// 设置定时器是否只触发一次, 参数为true定时器只触发一次, 为false定时器重复触发, 默认为false
void QTimer::setSingleShot(bool singleShot);


signals
        这个类的信号只有一个, 当定时器超时时,该信号就会被发射出来。给这个信号通过conect()关联一个槽函数, 就可以在槽函数中处理超时事件了。

[signal] void QTimer::timeout();

static public function

/*
功能: 在msec毫秒后发射一次信号, 并且只发射一次
参数:- msec:     在msec毫秒后发射信号- receiver: 接收信号的对象地址- method:   槽函数地址
*/
[static] void QTimer::singleShot(int msec, const QObject *receiver, PointerToMemberFunction method);



示例(获取系统时间并且将其显示到窗口中):
创建名为QTimerTest的项目,在mainwindow.ui文件中创建两个按钮和两个label

上面的“开始计时”按钮点击之后,在TextLabel中显示动态时间,下面的“开始计时”按钮点击之后,只获取一次当前时间。

 mainwindow.cpp代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QTimer>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建定时器对象QTimer* timer = new QTimer(this);//修改定时器精度//timer->setTimerType(QTimer::PreciseTimer);//按钮的点击事件connect(ui->loopBtn,&QPushButton::clicked,this,[=](){//启动定时器if(timer->isActive()){timer->stop();//关闭定时器ui->loopBtn->setText("开始");}else{ui->loopBtn->setText("关闭");timer->start(1000);//1000ms == 1s}} );connect(timer,&QTimer::timeout,this,[=](){QTime tm = QTime::currentTime();//格式化当前得到的系统时间QString tmstr = tm.toString("hh:mm:ss.zzz");//设置要显示的时间ui->curTime->setText(tmstr);});//发射一次信号connect(ui->onceBtn,&QPushButton::clicked,this,[=](){//获取2s以后的系统时间QTimer::singleShot(2000,this,[=](){QTime tm = QTime::currentTime();//格式化当前得到的系统时间QString tmstr = tm.toString("hh:mm:ss.zzz");//设置要显示的时间ui->onceTime->setText(tmstr);});});
}MainWindow::~MainWindow()
{delete ui;
}


运行结果:

 示例主要代码(每间隔一秒向控制台发送一条消息):
    //每间隔一秒向控制台发送一条信息
    connect(timer, &QTimer::timeout, this, [=]() {
        qDebug() << "This is the QTimer test!";
    });
    timer->start(1000);
上述代码运行结果: 

 注意事项:
1. 由于QTimer并不保证定时器事件的严格准确性,因此使用QTimer的应用程序不应该把定时器事件作为实时信号事件来处理。 如果QTimer在Linux上运行,那么通常会出现最多或少数几毫秒的时间误差,这与其他应用程序的运行和负载同时影响。 QObject类提供了一个`timerEvent()`函数,可以实现更精确的计时器。

2. 在大多数情况下,建议将定时器连接到QObject::startTimer()函数,并在哪里实现`timerEvent()`事件,这种方式能够避免多个计时器事件同时达到时可能引起的不稳定现象。另外要保证在计时器事件实现中,响应时间足够的短并且不会由于事件的阻塞导致主事件循环的失调。

3. QTimer的运行可能会占用系统大量资源,如果过于频繁的使用定时器,会导致程序变得缓慢或崩溃,因此应该根据需要慎重使用。定时器的使用通常用于UI界面、后台定时任务等场景。

4. 如果QTimer的间隔设置过小,也可能会出现定时器的不稳定性,所以在应用程序需要精细定时的情况下,应小心使用QTimer。

总的来说,定时任务虽然简单,但是要注意细节,做好异常处理。

                        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙OS开发实例:【工具类封装-页面路由】

import common from ohos.app.ability.common; import router from ohos.router 封装app内的页面之间跳转、app与app之间的跳转工具类 【使用要求】 DevEco Studio 3.1.1 Release api 9 【使用示例】 import MyRouterUtil from ../common/utils/MyRouterUtil MyRouterUtil…

giteed的使用

1. 将工作区的内容添加到暂存区 你的工作区要有内容&#xff08;.git 不算&#xff09; 注意&#xff1a;空文件可以添加&#xff0c;但是空文件夹不管 如果没有形成历史版本之前&#xff0c;暂存区的同名文件会被覆盖 //打开命令行&#xff0c;切换到 .git所在的目录&…

JVM常见垃圾收集算法

JVM常见垃圾收集算法 标记-清除算法复制算法标记-整理&#xff08;标记压缩&#xff09;算法分代收集算法新生代和老年代分代收集算法工作机制 面试题&#xff1a;为什么分代收集算法把堆分成年轻代和老年代&#xff1f; 标记-清除算法 最基础的算法&#xff0c;分标记和清除两…

红队笔记8-CTF5打靶流程-CMS漏洞-多用户信息泄露(vulnhub)

目录 开头: 1.主机发现和端口扫描&#xff1a; 2.80端口-NanoCMS哈希密码信息泄露-后台getshell 3.提权-用户过多信息泄露 4.总结&#xff1a; 开头: 学习的视频是哔哩哔哩红队笔记&#xff1a; 「红队笔记」靶机精讲&#xff1a;LAMPSecurityCTF5 - 标准攻击链&#xff…

ByteTrack多目标跟踪——yolox_model代码详解

文章目录 yolox_modelYOLOPAFPNYOLOXHeadmodel损失计算初步筛选SimOTA 求解 附&#xff1a;网络结构Cls headCls_convsCls_preds Reg headReg_convsReg_preds Obj headObj_preds yolox_model yolox_model主要包括以下几个文件:yolox.py、yolo_pafpn.py以及yolo_head.py train时…

[AIGC] MySQL存储引擎详解

MySQL 是一种颇受欢迎的开源关系型数据库系统&#xff0c;它的强大功能、灵活性和开放性赢得了用户们的广泛赞誉。在 MySQL 中&#xff0c;有一项特别重要的技术就是存储引擎。在本文中&#xff0c;我们将详细介绍什么是存储引擎&#xff0c;以及MySQL中常见的一些存储引擎。 文…

申请GeoTrust数字证书

GeoTrust介绍&#xff1a; 大家应该都不陌生&#xff0c;作为最老资格的一批国际大牌证书&#xff0c;GeoTrust的品牌效益和使用群体非常庞大。在数字证书领域也是当之无愧的龙头地位&#xff0c;作为Symantec和Digicert的子品牌&#xff0c;证书安全性能方面毋庸置疑&#xf…

IP SSL证书注册流程

使用IP地址申请SSL证书&#xff0c;需要用公网IP地址申请&#xff0c;申请之前确保直接的IP地址可以开放80或者443端口两者选择1个就好&#xff0c;端口不需要一直开放&#xff0c;只要认证的几分钟内开放就可以了&#xff0c;然后IP地址根目录可以上传txt文件。 IP SSL证书认…

Codeforces Round 800 (Div. 1)C. Keshi in Search of AmShZ 反向dijkstra,并附带权值

Problem - C - Codeforces 目录 题意&#xff1a; 思路&#xff1a; 答疑&#xff1a; 1.为什么反向做呢&#xff1f; 2.为什么是到达点的剩余度数呢&#xff1f; 3.相同路是否可以去重&#xff0c;用个set&#xff1f; 4.如果有多条路相同呢&#xff1f; 参考代码&am…

【SecretFlow——SPU基础】

1.SPU基础 SPU设备在SecretFlow中负责执行MPC计算。 2.代码解读 2.1 创建设备 import secretflow as sf # 如果存在secretflow&#xff0c;先关闭已经存在的环境 sf.shutdown() # 初始化四个参与方 sf.init([alice, bob, carol, dave], addresslocal) # 寻找未占用的端口来…

【YOLOV5 入门】——detect.py简单解析模型检测基于torch.hub的检测方法

声明&#xff1a;笔记是毕设时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 一、打开detect.py&#xff08;文件解析&#xff09; 打开上节桌面创建的yolov5-7.0文件夹里的detect.py文件&#xff08;up主使用的是VScode&#xff0c;我这里使用pycharm…

NLP深入学习:结合源码详解 BERT 模型(三)

文章目录 1. 前言2. 预训练2.1 modeling.BertModel2.1.1 embedding_lookup2.1.2 embedding_postprocessor2.1.3 transformer_model 2.2 get_masked_lm_output2.3 get_next_sentence_output2.4 训练 3. 参考 1. 前言 前情提要&#xff1a; 《NLP深入学习&#xff1a;结合源码详…

PyQt5开发——QCheckBox 复选框用法与代码示例

1. 复选框 QCheckBox 是 Qt 框架中的一个控件&#xff0c;用于在界面中表示一个可以被选中或取消选中的复选框。它通常用于允许用户在多个选项之间进行选择。在 Python 中使用 PyQt 或 PySide 开发 GUI 应用程序时&#xff0c;可以使用 QCheckBox 控件来实现复选框。 2.基本用…

[ Linux ] git工具的基本使用(仓库的构建,提交)

1.安装git yum install -y git 2.打开Gitee&#xff0c;创建你的远程仓库&#xff0c;根据提示初始化本地仓库&#xff08;这里以我的仓库为例&#xff09; 新建好仓库之后跟着网页的提示初始化便可以了 3.add、commit、push三板斧 git add . //add仓库新增&#xff08;变…

企业数字化转型:聊聊数据思维!

笔者曾在《深入聊一聊企业数字化转型这个事儿》 一文中给出了数字化转型的定义&#xff0c;即&#xff1a;通过应用数字化技术来重塑企业的信息化环境和业务过程。本质上来讲&#xff0c;企业数字化转型&#xff0c;不仅是技术方面的升级&#xff0c;更是企业文化、思维方式的转…

【计算机考研】408到底有多难?

你真以为大家是学不会408吗&#xff1f; 不是&#xff01;单纯是因为时间不够&#xff01;&#xff01;&#xff01; 再准确一些就是不会分配时间 408的知识其实并不难&#xff0c;要说想上130那确实有难度&#xff0c;但是100在时间充裕的情况下还是可以做到的 我本人是双…

非wpf应用程序项目【类库、用户控件库】中使用HandyControl

文章速览 前言参考文章实现方法1、添加HandyControl包;2、添加资源字典3、修改资源字典内容坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 前言 wpf应用程序中,在入口项目中存在App.xaml文件,在这个文件中加上对各个…

Linux之进程控制进程终止进程等待进程的程序替换替换函数实现简易shell

文章目录 一、进程创建1.1 fork的使用 二、进程终止2.1 终止是在做什么&#xff1f;2.2 终止的3种情况&&退出码的理解2.3 进程常见退出方法 三、进程等待3.1 为什么要进行进程等待&#xff1f;3.2 取子进程退出信息status3.3 宏WIFEXITED和WEXITSTATUS&#xff08;获取…

全球首位AI程序员Devin诞生,以此谈谈AI对程序员的影响

一、简介 全球首位 AI 程序员 Devin 是由初创公司 Cognition AI 创造的。这家公司成立仅四个月&#xff0c;却已经引起了广泛关注。 Devin作为人工智能的代表&#xff0c;将展示出人工智能在编程领域的潜力和能力&#xff0c;激发程序员探索和应用人工智能技术的兴趣。这将可…

NanoMQ的安装与部署

本文使用docker进行安装&#xff0c;因此安装之前需要已经安装了docker 拉取镜像 docker pull emqx/nanomq:latest 相关配置及密码认证 创建目录/usr/local/nanomq/conf以及配置文件nanomq.conf、pwd.conf # # # # MQTT Broker # # mqtt {property_size 32max_packet_siz…