【Qt】Qt系统 | Qt事件 | 定时器

news2024/12/24 9:12:53

文章目录

  • 定时器
  • QTimerEvent
  • QTimer
  • 获取系统日期及时间

定时器

Qt 中在进行窗口程序的处理过程中,经常要周期性的执行某些动作,或者制作一些动画效果,使用定时器可以实现这些需求。
定时器,会在间隔一定时间后,执行某一个任务。常见使用如倒计时,弹窗自动关闭之类等


Qt 中的定时器有 QTimeEventQTimer 这两个类

  • QTimerEvent类 用来描述一个定时器事件。在使用时通过 startTimer() 函数开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间它返回的整型值代表这个定时器,类似文件描述符和进程ID
  • QTimer类 实现一个定时器,它提供了更高层次的编程接口,如:使用信号槽,还可以设置只运行一次的定时器

QTimerEvent

上面说过,QTimeEvent 通过 startTimer() 函数创建的定时器触发,一次 startTimer() 就会创建一个定时器,函数返回值为整数,可以理解为定时器编号,类似计算机操作系统中的文件 struct file 或 进程task struct,由系统维护。
startTimer()函数原型如下:
在这里插入图片描述

int interval:定时器触发事件的周期,单位为毫秒
Qt::TimerType timerType:定时器类型,主要是精准度不同

在这里插入图片描述

  • Qt::PreciseTimer:将准确度保持毫秒级的精度
  • Qt::CoarseTimer:将准确度保持在所需间隔的5%以内
  • Qt::VeryCoarseTimer:将准确度保持完整的秒精度

代码示例:创建两个Label,显示数字。第一个Label的数字每1秒累加一次,第二个Label的数字每两秒累加一次

  1. 在 UI 界面文件放置两个 Label 控件
    在这里插入图片描述
  2. 编写 widget.h,声明 timerEvent(),定义两个整型变量接收定时器编号
    在这里插入图片描述
  3. 编写 widget.cpp,实现 timerEvent()
void Widget::timerEvent(QTimerEvent *event)
{
    //startTimer创建的定时器周期到达都会触发该事件
    if(timerid_1 == event->timerId())
    {
        //第一个定时器,每一秒触发一次,累加数字
        static int num = 1;
        qDebug() << "定时器1触发,时间:" << num;
        ui->label->setText(QString::number(num++));
    }
    else if(timerid_2 == event->timerId())
    {
        //第二个定时器,每两秒触发一次,累加数字
        static int num = 1;
        qDebug() << "定时器2触发,时间:" << num;
        ui->label_2->setText(QString::number(num++));
    }
}
  1. 运行结果如下:
    在这里插入图片描述

QTimer

QTimer 则使用信号槽机制,完成定时器

代码示例:实现简易的计时器
在 UI 界面放置一个 Label 标签,两个按钮,分别是"开始" 和 “停止”,当点击开始时每隔1秒累加一次,点击“停止”暂停计数

  1. 设计 UI 界面如下:在这里插入图片描述
  2. 编写 widget.cpp,编写相关信号槽函数
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QTimer *timer = new QTimer(this);
    //连接“开始”按钮信号槽
    connect(ui->pushButton, &QPushButton::clicked, this, [=](){
        timer->start(1000);
    });
    //连接定时器信号槽
    connect(timer, &QTimer::timeout, this, [=](){
        static int num = 1;
        ui->label->setText(QString::number(num++));
    });
    //连接“停止”按钮信号槽
    connect(ui->pushButton_2, &QPushButton::clicked, this, [=](){
        timer->stop();
    });
}
  1. 运行结果如下:
    在这里插入图片描述

获取系统日期及时间

在 Qt 中,获取系统的日期及实时时间可以通过 QTimer类 或 QDateTime类
QDateTime类 提供了字符串格式的时间。字符串形式的时间输出格式由 toString() 方法中的 format 参数列表决定

时间日期格式,形如yyyy/M/d H:mm 2024/07/31 09:35

可用的参数列表如下:

  • y表示年份
  • M表示月份
  • d表示日期
  • H表示小时
  • m表示分钟
  • s表示秒

代码示例:获取系统日期及实时时间

  1. 设计 UI 界面文件。放置一个Label控件, 用来显示日期和时间,放置两个按钮:“开始” 和 “停止”
    在这里插入图片描述
  2. 编写 widget.cpp,连接相应信号槽
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建定时器
    QTimer* timer = new QTimer(this);
    //连接“开始”按钮信号槽
    connect(ui->pushButton, &QPushButton::clicked, this, [=](){
        timer->start(1000);
    });
    //连接定时器信号槽
    connect(timer, &QTimer::timeout, this, [=](){
        QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
        ui->label->setText(time);
    });
    //连接“停止”按钮信号槽
    connect(ui->pushButton_2, &QPushButton::clicked, this, [=](){
        timer->stop();
    });
}
  1. 运行结果如下:
    在这里插入图片描述

结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

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

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

相关文章

八岁编程小天才:45分钟挑战AI极限,聊天机器人一鸣惊人

一位8岁的小女孩&#xff0c;用短短45分钟就搭建出了一个聊天机器人&#xff0c;吸引了180万人的在线围观。 Cursor&#xff0c;这款被Cloudflare副总裁家8岁女儿青睐的AI代码编辑器&#xff0c;成为全网热议的焦点。 甚至许多网友出来发话力挺。 AI编程&#xff0c;从复杂到简…

swagger,Knife4j和Yapi

目录 swagger swagger的作用 swagger的使用 一.导入依赖 二.创建swagger配置类&#xff0c;交给SpringIoC容器管理 三.使用swagger依赖的注解来给接口层(controller)的各种方法进行注释 Api ApiOperation ApiImplicitParam ApiModel ApiModelProperty 四&#xff1a;…

【layUI】点击导出按钮,导出excel文件

要实现的功能如下&#xff1a;根据执行状态判断是否可以导出。如果可以导出&#xff0c;点击导出&#xff0c;在浏览器里下载对应的文件。 代码实现 html里&#xff1a; <table class"layui-hide" id"studentTable" lay-filter"studentTable&…

vue2表单校验:添加自定义el-form表单校验规则

前言 在vue2表单校验&#xff1a;el-form表单绑定数组并使用rules进行校验_vue2 rules校验-CSDN博客中&#xff0c;使用form原生的rules对表单中每个控件的必填、格式等做了校验。但是保存时&#xff0c;除了验证每一个控件的输入合乎要求外&#xff0c;还需要验证控件之间的数…

八、DMA直接存储器存取

1、DMA简介 DMA是一个数据转运小助手&#xff0c;用来协助CPU完成转运的工作 2、存储器映像 计算机系统的5大组成部分&#xff1a;运算器、控制器、存储器、输入设备、输出设备 运算器和控制器&#xff0c;合称CPU 计算机的核心关键部分是CPU和存储器 存储器涉及&#xff…

带你深入浅出新面经:十五、十大排序之堆排序

此为面经第十五谈&#xff01;关注我&#xff0c;每日带你深入浅出一个新面经。 我们要了解面经要如何“说”&#xff01; 很重要&#xff01;很重要&#xff01;很重要&#xff01; 我们通常采取总-分-总方式来阐述&#xff01;&#xff08;有些知识点&#xff0c;你可以去…

Linux--find命令-搜索

find 命令 用来在指定目录下查找文件 如果使用该命令时&#xff0c;不设置任何参数&#xff0c;则find命令将在当前目录下查找子目录与文件&#xff0c;并且将查找到的子目录和文件全部进行显示 find <指定目录> <指定条件> <指定动作> 默认是搜索当前目录…

C语言:编程世界的基石

在计算机科学的世界里&#xff0c;C语言就像一座坚固的桥梁&#xff0c;连接着硬件和软件的两端。自从20世纪70年代诞生以来&#xff0c;C语言以其简洁、高效和强大的特性&#xff0c;成为了编程领域的经典之作。本文将探讨C语言在不同工作领域中的应用&#xff0c;以及它为何能…

opensatck上windows云主机上java服务的端口调用问题处理

文章目录 前言一、思路二、解决步骤1.将安全组规则全部放开2.云主机内部防火墙关闭3.尝试telnet4.查看代码&#xff0c;修改IP配置 总结 前言 opensatck上windows云主机上java服务的端口调用问题处理。同事在window10的云主机中用idea起了调试中的服务&#xff0c;端口在8000&…

鸿蒙操作系统为前端开发者带来下一个风口

在科技飞速发展的当下&#xff0c;前端开发领域也在不断寻求新的突破和机遇。而鸿蒙操作系统的崛起&#xff0c;无疑为前端开发者带来了下一个令人瞩目的风口。 一、鸿蒙系统的独特优势 1. 分布式架构 鸿蒙系统的分布式架构打破了传统设备之间的界限&#xff0c;使得不同设备可…

了解如何使用 Google 的 Gemini-1.5-pro 最新模型开发用于卡路里计算的生成式 AI 应用

欢迎来到雲闪世界。 例如&#xff0c;你有没有想过&#xff0c;当你吃晚餐时&#xff0c;你摄入了多少卡路里&#xff1f;我经常这样做。如果你能简单地通过应用程序发送一张你的盘子照片&#xff0c;并在你决定要吃多少之前得到卡路里总量的估计值&#xff0c;那不是很棒吗&am…

springboot依赖之JDBC(二)

要在 IntelliJ IDEA 中创建一个 Spring Boot 项目并实现基于 JdbcTemplate 的增删改查功能&#xff0c;以下是一个详细的步骤和代码示例。这个例子使用一个简单的用户信息表&#xff08;users&#xff09;&#xff0c;并展示如何使用 JdbcTemplate 的各种方法进行操作。 前文有…

【Linux —— 生产者消费者模型】

Linux —— 生产者消费者模型 生产者消费者模型概述生产者消费者模型特点生产者消费者模型优点基于BlockingQueue的生产者消费者模型 生产者消费者模型概述 生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。在这个模型中,有两种角色:生产者…

Python 3.11 从入门到实战1(环境准备)

本篇文章是python3.11的学习开篇&#xff0c;我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;获得python基础学习与实例、实践相结合&#xff0c;使我们完全掌握python。并做到独立完成项目开发的能力。 今天的谈论的比较简单&#xff0c;也是后续学习的基础。pyt…

深入MySQL

MySQL逻辑架构 MySQL逻辑架构整体分为三层&#xff0c;顶层客户端并非MySQL独有&#xff0c;如&#xff1a;连接处理、授权认证、安全等功能都在客户端层。 核心服务层&#xff0c;MySQL大多数核心服务都在这一层&#xff0c;包括查询解析、分析、优化、缓存、内置函数等。所有…

Python中csv文件的操作5

在《Python中csv文件的操作1》中提到&#xff0c;可以通过read()和write()方法读取和写入csv文件中的所有内容。除了上述的两个方法外&#xff0c;还可以通过readline()、readlines()、writelines()实现csv文件的读写操作。 1 readline()方法 readline()方法每次只读取文件的…

入行「游戏策划」,该从何处下手?

想知道策划岗位该怎么入行可点击蓝链 相比较起以技术为最重要评判标准的开发岗&#xff0c; 「游戏策划」这一岗位在非业界人士的眼中 一直都是一个风评方差很大的岗位。 有人说策划岗又轻松又威风&#xff0c; 只需要输出想法&#xff0c;落地都交给开发&#xff0c; 干…

xss-labs 11-15关通关攻略

第11关 一.进入11关 二.进行抓包 在抓到的数据包中加入Referer:"οnclick"alert(1)"type"text 第12关 进入第12关发现没有注入点&#xff0c;进入源代码看哪里可以注入发现 二.在ua头注入 Referer:"οnclick"alert(1)"type"text…

【鸿蒙样式初探】多个组件如何共用同一样式

最近开发鸿蒙&#xff0c;刚接触难免二和尚摸不着头脑&#xff0c;尤其是样式...... 背景 在做银行卡显示的一个小需求时&#xff1a; 每个Text都需要设置fontColor:#FFFFFF" 想着是否可以简单点 解决历程 思路一&#xff1a;&#xff08;拒绝) 使用Styles 提取封装公…

matlab仿真 信道编码和交织(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; ​ ​ ​ clear alln3;k2;%A(3,2)循环码N10000;%消息比特的行数msgrandi([0 1],N,k);%消息比特一共N*k行polcyclpoly(n,k);…