【QT】定时器事件 - QTimerEvent QTimer

news2024/12/26 21:11:58

qt 系统 - 定时器

  • 定时器
    • 1. QTimerEvent
    • 2. QTimer
    • 3. 获取系统日期及时间

定时器

Qt 中在进行窗口程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使用定时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀个任务。定时器在很多场景下都会使⽤到,如弹窗⾃动关闭之类的功能等。

Qt 中的定时器分为 QTimerEventQTimer 这2个类。

  • QTimerEvent 类用来描述⼀个定时器事件。在使用时需要通过 startTimer() 函数来开启⼀个定时器,这个函数需要输⼊⼀个以毫秒为单位的整数作为参数来表明设定的时间,它返回的整型值代表这个定时器。当定时器溢出时(即定时时间到达)就可以在 timerEvent() 函数中获取该定时器的编号来进行相关操作。
  • QTimer 类来实现⼀个定时器,它提供了更高层次的编程接口,如:可以使用信号和槽,还可以设置只运行一次的定时器。

1. QTimerEvent

示例代码1: 在UI界⾯上放置两个 Label 控件,⼀个让其1秒数字累加⼀次,⼀个让其2秒数字累加⼀次。

1、新建项⽬,在UI界⾯⽂件放置两个 Label 控件:

在这里插入图片描述

2、在 “widget.h” 头⽂件中声明 timerEvent() 函数,并定义两个整型变量 timer_id1timer_id2

				class Widget : public QWidget
				{
				    Q_OBJECT
				
				public:
				    Widget(QWidget *parent = nullptr);
				    ~Widget();
				    
				    // 重写定时器事件
				    void timerEvent(QTimerEvent* event);
				
				private:
				    Ui::Widget *ui;
				    
				    int timer_id1 = 0;
				    int timer_id2 = 0;
				};

3、在 “widget.cpp” ⽂件中重写 timerEvent() 函数;

			Widget::Widget(QWidget *parent)
			    : QWidget(parent)
			    , ui(new Ui::Widget)
			{
			    ui->setupUi(this);
			
			    // 启动定时器
			    timer_id1 = startTimer(1000);
			    timer_id2 = startTimer(2000);
			}
			
			void Widget::timerEvent(QTimerEvent *event)
			{
			    if(event->timerId() == timer_id1) {
			        static int num1 = 1;
			
			        // lb1 每隔1秒加一次
			        ui->lb1->setText(QString::number(num1++));
			    }
			
			    if(event->timerId() == timer_id2) {
			        static int num2 = 1;
			
			        // lb2 每隔2秒加一次
			        ui->lb2->setText(QString::number(num2++));
			    }
			}

效果如下:

在这里插入图片描述

2. QTimer

代码示例: 在UI界⾯放置⼀个 Label 标签,两个按钮,分别是 “开始” 和 “停⽌” ,当点击 “开始” 按钮时,开始每隔1秒计数⼀次,点击 “停⽌” 按钮时,暂停计数。

1、设计 UI 界⾯如下:

在这里插入图片描述

2、在 “widget.cpp” ⽂件中实现对应功能;

			#include "widget.h"
			#include "ui_widget.h"
			#include <QTimer>
			
			Widget::Widget(QWidget *parent)
			    : QWidget(parent)
			    , ui(new Ui::Widget)
			{
			    ui->setupUi(this);
			
			    QTimer* time = new QTimer(this);
			
			    connect(ui->btn1, &QPushButton::clicked, [=](){
			        time->start(1000);
			    });
			
			    connect(time, &QTimer::timeout, [=](){
			        static int num = 1;
			        ui->label->setText(QString::number(num++));
			    });
			
			    connect(ui->btn2, &QPushButton::clicked, [=](){
			        time->stop();
			    });
			}

实现效果如下:

在这里插入图片描述

3. 获取系统日期及时间

在 Qt 中,获取系统的日期及实时时间可以通过 QTimer 类 和 QDateTime类。

QDateTime 类提供了字符串格式的时间。字符串形式的时间输出格式由 toString() 方法中的 format 参数列表决定,可用的参数列表如下:

在这里插入图片描述

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

1、设计UI界面文件;放置⼀个 Label 控件,⽤来显示日期及时间,放置两个按钮:“开始” 和 “停止” ;

在这里插入图片描述

2、在 “widget.h” 头⽂件中声明更新时间的槽函数 TimeUpDate();

			class Widget : public QWidget
			{
			    Q_OBJECT
			
			public:
			    Widget(QWidget *parent = nullptr);
			    ~Widget();
			
			private:
			    Ui::Widget *ui;
			    
			public slots:
			    void TimeUpDate();
			};

3、在 “widget.cpp” ⽂件中实现对应功能;

			#include "widget.h"
			#include "ui_widget.h"
			#include <QTimer>
			#include <QDateTime>
			
			Widget::Widget(QWidget *parent)
			    : QWidget(parent)
			    , ui(new Ui::Widget)
			{
			    ui->setupUi(this);
			
			    QTimer* time = new QTimer(this);
			
			    connect(ui->btn1, &QPushButton::clicked, [=](){
			        time->start(1000);
			    });
			
			    connect(ui->btn2, &QPushButton::clicked, [=](){
			        time->stop();
			    });
			
			    connect(time, &QTimer::timeout, this, &Widget::TimeUpDate);
			}
			
			void Widget::TimeUpDate()
			{
			    QString str = QDateTime::currentDateTime().toString("yyyy-MM-dd hh::mm::ss");
			    ui->label->setText(str);
			}

实现的效果如下:

在这里插入图片描述

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

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

相关文章

《python语言程序设计》第6章第1题数,数学方面:五角数n(3n-1)/2 前100个五角数

第4次做第6章 def getPentagonalNumber(n):count 0for i in range(1, n):count 1pen_num round(i * ((3 * i) - 1) / 2)print(f"{pen_num}", end" ")if count % 10 0:print()getPentagonalNumber(100)

Java语言程序设计基础篇_编程练习题**15.15 (几何问题:添加或删除点)

**15.15 (几何问题:添加或删除点) 请编写一个程序&#xff0c;让用户在面板上单击以自动创建或移去点(参见15-28a)。当用户左击鼠标时(主按钮)&#xff0c;就创建一个点并且显示在鼠标的位置&#xff0c;用户还可以将鼠标移到一个点上&#xff0c;然后右击鼠标(次按钮)以移去这…

C语言-网络编程-UDP通信创建流程

UDP 通信创建流程 UDP 是⼀个传输层的⽆连接的协议&#xff0c;我们编写代码⼀般是分为两个端。⼀个我们称之为发送端&#xff0c;另⼀ 个我们称之为接收端。正常⼀般是接收端先运⾏&#xff0c;然后等待结束发送端发送过来的数据。 创建套接字 首先&#xff0c;我们需要创建…

JDK8升级到JDK17,报错Error:java:错误:不支持的发行版本5

1 问题描述&#xff1a; 我原来用到是JDK8,后来重新安装了JDK17后&#xff0c;并更换了JAVA_HOME的配置&#xff0c;在CDM上面查看JAVA版本确认安装无误。 当我打开IDEA运行代码时&#xff0c;就报错java&#xff1a;错误&#xff1a;不支持的发行版本5&#xff0c;至始至终我都…

Leetcode509. 斐波那契数(递归和常规两种写法)

问题描述&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;…

Python酷库之旅-第三方库Pandas(037)

目录 一、用法精讲 116、pandas.Series.div方法 116-1、语法 116-2、参数 116-3、功能 116-4、返回值 116-5、说明 116-6、用法 116-6-1、数据准备 116-6-2、代码示例 116-6-3、结果输出 117、pandas.Series.truediv方法 117-1、语法 117-2、参数 117-3、功能 …

C语言编译报错:error: expected declaration or statement at end of input(缺了括号)

文章目录 报错信息分析解决步骤&#xff1a; 排查 报错信息 /userdata/testOtherPrj/20240715_box_circuit_breaker/test/external/modbus_vendorA/src/vendor_a_modbus.c: In function ‘VendorA_PowerStop’: /userdata/testOtherPrj/20240715_box_circuit_breaker/test/exte…

25届近4年电子科技大学自动化考研院校分析

电子科技大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近4年考研分数情况 四、近4年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定教…

EasyAnimate-v3 实测,阿里开源视频生成模型,5 分钟带你部署体验,支持高分辨率超长视频

自从 Sora 发布以来&#xff0c;AI 视频生成的热度不减&#xff0c;社区中涌现了大量类 Sora 的开源项目。 前不久&#xff0c;快手开放了可灵视频生成模型的内测&#xff0c;不过可灵是闭源的&#xff0c;相信很多小伙伴还没拿到内测名额。 今天给大家分享一款开源的视频生成…

Springboot 启动时Bean的创建与注入(一)-面试热点-springboot源码解读-xunznux

Springboot 启动时Bean的创建与注入&#xff0c;以及对应的源码解读 文章目录 Springboot 启动时Bean的创建与注入&#xff0c;以及对应的源码解读构建Web项目流程图&#xff1a;堆栈信息&#xff1a;堆栈信息简介堆栈信息源码详解1、main:10, DemoApplication (com.xun.demo)2…

currentTarget和target

*.wxml *.js 点击按钮 发现 currentTarget 获取的是事件绑定者的参数 target 获取的是事件触发者的参数

vue3前端开发-小兔鲜项目-一级页面产品列表渲染

vue3前端开发-小兔鲜项目-一级页面产品列表渲染&#xff01; 这一次做两件事。第一个是给导航栏增加一个动态标记的属性。第二件事是渲染一下一级页面内产品列表。 第一件事&#xff0c;很简单&#xff0c;路由器插件&#xff0c;自带了这种属性。 如图所示&#xff0c;有一个…

最新CSM客户成功 OKR 案例:以指导、激励和调整您的团队

客户是任何企业的命脉&#xff0c;而客户服务是与客户接触的第一站&#xff0c;是实现目标和扩大组织规模是以保留客户和追加销售为前提的。 客户成功CSM是一种商业方法&#xff0c;确保客户在使用你的产品/服务时达到他们想要的结果。客户成功是以关系为中心的客户管理&#…

昇思25天学习打卡营第22天|ResNet50图像分类

ResNet网络介绍 ResNet50网络是2015年由微软实验室的何恺明提出&#xff0c;获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前&#xff0c;传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的&#xff0c;但当网络堆叠到一定深度时&#xff0c;就会出现退化问…

Linux系统编程基础

Linux操作系统 Linux不是一个具体的操作系统&#xff0c;而是一类操作系统的总称&#xff0c;具体版本成为发行版。 Red Hat&#xff1a;目前被IBM收购&#xff0c;收费版&#xff0c;目前最大的Linux供应商CentOS&#xff1a; Red Hat退出的免费版Ubuntu&#xff1a;界面比较友…

公司技术栈用到了RocketMQ,我对此块知识进行了回顾(初始RocketMQ)

前言 作为24届的校招生&#xff0c;不知道大伙儿们是否都已经到了工作岗位上。为了以后更方便的接触到公司的业务&#xff0c;我司为我们安排了将近一个月的实操。虽然不用敲代码&#xff0c;但是… 了解到我司使用到的技术栈&#xff0c;在空闲时间正好对RocketMQ这块技术做个…

Redis集群部署Windows版本

Redis集群 之前因为数据量的原因&#xff0c;并没有进行Redis集群的配置需要&#xff0c;现在由于数据量大&#xff0c;需要进行集群部署。 最初在windows系统部署&#xff0c;需要Redis的windows版本&#xff0c;但官方没有windows版本&#xff0c;所以需要去gitHub上找由民…

git使用-命令行+VS Code结合使用

一、Git常用命令 // 显示当分支的状态。它会列出已修改、已暂存和未跟踪的文件 git status// 列出本地仓库中所有的分支&#xff0c;其中会特殊显示当前所在分支 git branch// 在当前分支的基础上创建一个新的分支&#xff0c;并切换到这个新的分支上 git checkout -b 新分支…

超声波清洗机洗眼镜好吗?一篇文章告诉你买超声波清洗机有必要吗

眼镜党们&#xff0c;你们是不是也有眼镜清洁的烦恼&#xff1f;日常生活中&#xff0c;我们佩戴的眼镜很容易就会沾上脏污&#xff0c;而经常擦拭又会损伤眼镜镜片&#xff0c;而且&#xff0c;长时间未清洁的尘埃、油脂乃至细菌&#xff0c;会影响我们的视觉健康&#xff0c;…

被问到MQ消息已丢失,该如何处理?

在分布式系统中&#xff0c;消息中间件&#xff08;如 RabbitMQ、RocketMQ、Kafka、Pulsar 等&#xff09;扮演着关键角色&#xff0c;用于解耦生产者和消费者&#xff0c;并确保数据传输的可靠性和顺序性。尽管我们通常会采取多种措施来防止消息丢失&#xff0c;如消息持久化、…