Qt定时器类QTimer

news2024/9/23 23:24:30

目录

public/slot function

signals

static public function

示例(获取系统时间并且将其显示到窗口中):

 示例主要代码(每间隔一秒向控制台发送一条消息):

 注意事项:

        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.coloradmin.cn/o/689699.html

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

相关文章

Bootstrap CSS 概览

文章目录 Bootstrap CSS 概览HTML 5 文档类型&#xff08;Doctype&#xff09;移动设备优先响应式图像全局显示、排版和链接基本的全局显示排版链接样式 避免跨浏览器的不一致容器&#xff08;Container&#xff09;Bootstrap 浏览器/设备支持 Bootstrap CSS 概览 在这一章中&a…

iOS-苹果内购的流程图

关于苹果内购的开发文章有很多&#xff0c;如&#xff1a; Flutter上线项目实战——苹果内购 苹果内购流程&#xff0c;看我就足够了 - 简书 。 下面这是一张苹果内购的流程图。 ​​​​​​​ 该图来源于苹果官网&#xff0c;但不够清晰&#xff0c;欢迎各位网络大牛 告知…

关于cdh环境中zookeeper启动失败NodeManager内存溢出无法链接等的问题

在此记录一下 1、zookeeper一直启动失败&#xff1a; 看你的事物目录配置的是什么 解决方法&#xff1a;删除掉/var/lib/zookeeper/version-2 为0kb的有问题文件&#xff0c;问题解决 2、NodeManager内存溢出无法链接等的问题 注意几点&#xff1a; 1、这里不能超过物理内存…

MySQL数据库学习(保姆级教程)(1.7W字)

1.初识MySQL JavaEE:企业级Java开发 Web 前端&#xff08;页面&#xff1a;展示&#xff0c;数据&#xff01;&#xff09; 后台&#xff08;连接点&#xff1a;连接数据库JDBC&#xff0c;链接前端&#xff08;控制&#xff0c;控制视图跳转&#xff0c;和给前端传递数据&a…

h.264与h.265有什么区别

H.265是新的编码协议&#xff0c;是H.264的升级版。H.265相比H.264最主要的改变是采用了块的四叉树划分结构&#xff0c;也极大了优化了算法&#xff0c;H.265比H.264占用的存储空间理论上要少50%。H.265在各方面都碾压了H.264。 1&#xff0c;H265优点&#xff1a;降低存储空间…

行列转换(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 行列转换 • Mysql版 1.准备操作2.行转列1.1为何进…

vue前端和nodejs后端使用socket.io无法通信问题解决

(128条消息) 使用 socket.io 跨域问题的解决&#xff08;整理了四种方法&#xff0c;总有成功的&#xff01;&#xff09; Access to XMLHttpRequest at ‘http://localhost:4000/socket.io_socket io()出现跨域问题_it1790的博客-CSDN博客 socket.io的版本是4.6.2

【Java】Java核心 73:XML (中)

文章目录 5 XML的组成&#xff1a;字符区(了解)**6** **DTD约束(能够看懂即可)****1** **什么是DTD****2** **DTD约束的实现和语法规则&#xff08;看懂dtd约束&#xff0c;书写符合规范的xml文件&#xff09;** 5 XML的组成&#xff1a;字符区(了解) 当大量的转义字符出现在x…

MATLAB随机打乱矩阵(按行或列)

1、重新排列矩阵各行 a [1 2;3 4;5 6;7 8]; rowrank randperm(size(a, 1)); % size获得a的行数&#xff0c;randperm打乱各行的顺序 a1 a(rowrank,:) % 按照rowrank重新排列各行&#xff0c;注意rowrank的位置2、重新排列矩阵各列 b [1 3 5 7;2 4 6 8 ]; r…

【AntDB数据库】AntDB数据库整体架构

整体架构 AntDB包括计算节点(Coordinator)、数据节点(DB)、全局事务管理器&#xff08;GTM&#xff09;和管理节点四种组件&#xff0c;其中GTM和DB为有状态的组件&#xff0c;需要考虑高可用&#xff0c;架构如下图&#xff1a; 计算节点(Coordinator)&#xff1a;提供SQL解…

ffmpeg dec中AVCodecHWConfigInternal在那里使用

在做ffmpeg decode插件的时候&#xff0c;发现需要增加一个AVCodecHWConfigInternal数组&#xff0c; //就是这个数组 static const AVCodecHWConfigInternal *efcodec_hw_configs[] {&(const AVCodecHWConfigInternal) {.public {.pix_fmt AV_PIX_FMT_EFCCODEC,.me…

Jupyter notebook运行环境创建

进入到jupyter notebook,没找到自己之前创建的环境xzc_pytorch 进入到Anaconda prompt,输入如下命令 (xzc_pytorch) C:\Users\xzc> conda install ipykernel安装完后&#xff0c;重启jupyter notebook发现还是没有 &#xff0c;此时选择手动创建&#xff0c;在base环境下执…

【Nginx】第四章 Nginx配置实例-反向代理

4.1 反向代理实例一 实现效果&#xff1a;使用nginx反向代理&#xff0c;访问 www.123.com 直接跳转到localhost:8080 4.1.1 实验准备工作 启动一个 tomcat&#xff0c;浏览器地址栏输入 localhost:8080&#xff0c;出现如下界面 在liunx系统安装tomcat&#xff0c;使用默认…

【运维部署】亚马逊云服务器安装后通过Xhell远程登录提示“所选的用户密钥未在远程主机上注册。请再试一次”

这里写自定义目录标题 背景解决方案第一步 确认配置第二步 确认权限方案C 背景 最新亚马逊云服务准备扩容&#xff0c;新建了一台Ubuntu服务器&#xff0c;密钥对使用原来服务器上的密钥对&#xff0c;创建后直接迁移到了新的服务器上。 通过 less .ssh/authorized_keys 可以查…

【Rust】1、实战:语法和数据结构、生命周期-所有权-借用、自制 CPU、内存

文章目录 一、概述1.1 安全性1.1.1 垂悬指针1.1.2 数据竞争1.1.3 迭代器失效 1.2 性能1.3 vscode 設置 二、基础语法2.1 循环2.2 引用2.3 生命周期2.4 泛型2.5 实战grep项目2.6 数组2.6.1 数组和切片2.6.2 动态数组2.6.3 初始化 2.7 包含第三方库2.8 命令行参数2.9 读文件2.9.1…

Python零基础入门(六)——超详细的字符串与正则表达式

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

基于java的汽车服务管理系统(Car Service Management System)

设计一款基于java的管理和跟踪对车辆所做服务的系统。我们的系统允许服务技术人员跟踪客户、他们的车辆以及对这些车辆所做的服务。 需要项目的朋友私信我&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Car Service Management System 基本的使用…

【OpenCV • c++】颜色数据结构与颜色空间转换

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…

chatgpt赋能python:Python:一个值得花钱学习的编程语言

Python&#xff1a;一个值得花钱学习的编程语言 近年来&#xff0c;Python成为了一款备受欢迎的编程语言&#xff0c;尤其在数据科学、人工智能等领域表现出色。许多人开始进入Python编程领域&#xff0c;而且Python培训课程也爆发式增长。但是&#xff0c;一些人对于Python的…

react中基于腾讯云cos上传图片组件

react中基于腾讯云cos上传图片组件 效果示例图上传图片组件imageUploadcomponents/imageUpload/index.jsxcomponents/imageUpload/upload.scss 使用组件 效果示例图 上传图片组件imageUpload npm install cos-js-sdk-v5 -S components/imageUpload/index.jsx import ".…