当前位置: 首页 > news >正文

Qt 定时器事件

文章目录

  • 1 定时器事件
    • 1.1 界面布局
    • 1.2 关联信号槽
    • 1.3 重写timerEvent
    • 1.4 实现槽函数 启动定时器
  • 2 定时器类

在这里插入图片描述

项目完整的源代码

QT中使用定时器,有两种方式:

  • 定时器类:QTimer
  • 定时器事件:QEvent::Timer,对应的子类是QTimerEvent

1 定时器事件

1.1 界面布局

把两个标签以及“启动”、“停止"、“复位”三个按钮布局在界面上。

首先,来到timer_widget.h,声明两个标签:

// timer_widget.h
private:QLabel *lbl1;QLabel *lbl2;

timer_widget.cpp 中 实现布局

// timer_widget.cppTimerWidget::TimerWidget(QWidget* parent) : QWidget{parent} {QVBoxLayout* verticalLayout = new QVBoxLayout(this);verticalLayout->setSpacing(0);verticalLayout->setContentsMargins(0, 0, 0, 0);// 第一个标签控件lbl1 = new QLabel(this);lbl1->setFrameShape(QFrame::Box);lbl1->setFixedSize(100, 100);lbl1->setStyleSheet("background-color: red;");verticalLayout->addWidget(lbl1);// 第二个标签控件lbl2 = new QLabel(this);lbl2->setFrameShape(QFrame::Box);lbl2->setFixedSize(100, 100);lbl2->setStyleSheet("background-color: blue;");verticalLayout->addWidget(lbl2);// 添加水平布局 - 三个按钮QHBoxLayout* horizontalLayout = new QHBoxLayout(this);horizontalLayout->setSpacing(0);horizontalLayout->setContentsMargins(0, 0, 0, 0);verticalLayout->addLayout(horizontalLayout);QPushButton* btnStart = new QPushButton(this);QPushButton* btnStop = new QPushButton(this);QPushButton* btnReset = new QPushButton(this);btnStart->setText("开始");btnStop->setText("停止");btnReset->setText("复位");horizontalLayout->addWidget(btnStart);horizontalLayout->addWidget(btnStop);horizontalLayout->addWidget(btnReset);this->setStyleSheet(R"(QPushButton {font-Size: 22px;})");connect(btnStart, &QPushButton::clicked, this,&TimerWidget::onStartClicked);connect(btnStop, &QPushButton::clicked, this, &TimerWidget::onStopClicked);connect(btnReset, &QPushButton::clicked, this,&TimerWidget::onResetClicked);
}

1.2 关联信号槽

关联按钮与槽函数

// 点击按钮触发开启定时器函数
connect(btnStart, &QPushButton::clicked, this,&TimerWidget::onStartClicked);
// 点击按钮触发关闭定时器函数connect(btnStop, &QPushButton::clicked, this, &TimerWidget::onStopClicked);
// 点击按钮触发标签复位connect(btnReset, &QPushButton::clicked, this,&TimerWidget::onResetClicked);

1.3 重写timerEvent

timer_widget.cpp 文件中重写timerEvent函数

// timer_widget.cppvoid TimerWidget::timerEvent(QTimerEvent* event) {// id1 的时间为 10ms 时间到了 做这件事if (event->timerId() == id1) {lbl1->move(lbl1->x() + 5, lbl1->y());if (lbl1->x() > this->width()) {lbl1->move(0, lbl1->y());}// id2 的时间为 20ms 时间到了 做这件事} else if (event->timerId() == id2) {lbl2->move(lbl2->x() + 5, lbl2->y());if (lbl2->x() > this->width()) {lbl2->move(0, lbl2->y());}}
}

1.4 实现槽函数 启动定时器

timer_widget.cpp

void TimerWidget::onStartClicked() {// 启动定时器 - timerEvent// 时间到了自动执行timerEvent函数id1 = startTimer(10);  // 10msid2 = startTimer(20);
}void TimerWidget::onStopClicked() {killTimer(id1);killTimer(id2);
}void TimerWidget::onResetClicked() {lbl1->move(0, lbl1->y());lbl2->move(0, lbl2->y());
}

2 定时器类

接下来,使用定时器类QTimer来实现以上同样的效果

首先,在timer_widget.h声明两个定时器类的对象,以及定时超时的槽函数:

// timer_widget.h
private slots:void onTimerout1();void onTimerout2();private:QTimer *timer1;QTimer *timer2;

然后,在timer_widget.cpp中实现两个定时超时槽函数:

// timer_widget.cpp
void TimerWidget::onTimerout1() {lbl1->move(lbl1->x() + 5, lbl1->y());if (lbl1->x() > this->width()) {lbl1->move(0, lbl1->y());}
}void TimerWidget::onTimerout2() {lbl2->move(lbl2->x() + 5, lbl2->y());if (lbl2->x() > this->width()) {lbl2->move(0, lbl2->y());}
}

关联结束时间信号触发槽

// timer_widget.cpptimer1 = new QTimer(this);timer2 = new QTimer(this);connect(timer1, &QTimer::timeout, this, &TimerWidget::onTimerout1);connect(timer2, &QTimer::timeout, this, &TimerWidget::onTimerout2);

实现槽函数 启动定时器

void TimerWidget::onStartClicked() {timer1->start(10);timer2->start(20);
}void TimerWidget::onStopClicked() {timer1->stop();timer2->stop();
}

相关文章:

Qt 定时器事件

文章目录 1 定时器事件1.1 界面布局1.2 关联信号槽1.3 重写timerEvent1.4 实现槽函数 启动定时器 2 定时器类 项目完整的源代码 QT中使用定时器,有两种方式: 定时器类:QTimer定时器事件:QEvent::Timer,对应的子类是QTi…...

LLM 推理优化探微 (2) :Transformer 模型 KV 缓存技术详解

编者按:随着 LLM 赋能越来越多需要实时决策和响应的应用场景,以及用户体验不佳、成本过高、资源受限等问题的出现,大模型高效推理已成为一个重要的研究课题。为此,Baihai IDP 推出 Pierre Lienhart 的系列文章,从多个维…...

JavaEE进阶(15)Spring原理:Bean的作用域、Bean的生命周期、Spring Boot自动配置(加载Bean、SpringBoot原理分析)

接上次博客:JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)-CSDN博客 目录 关于Bean的作用域 概念 Bean的作用域 Bean的生命周期 源码阅读 Spring Boot自动配置 Spring 加载Bean 问题描述 原因分析 …...

ELK-介绍及Elasticsearch集群搭建

ELK是三个开源软件的缩写,分别为Elasticsearch、Logstash、kibana它们都是开源软件。后来新增了一个FileBeat,它是一个轻量及的日志收集处理工具,因为Logstash由java程序开发,比较消耗内存资源,后来将Logstash使用go语…...

保障数据安全,提升性能:探秘Redis AOF持久化机制在在线购物网站的应用

AOF(Append-Only File)日志介绍 Redis使用AOF持久化来保证数据的可靠性。AOF日志是一个追加写文件,记录了所有对Redis数据进行修改的命令。 AOF的常规用途 通常,人们将Redis的AOF用于将后端数据库中的数据存储在内存中&#xf…...

魔众智能AI系统v2.1.0版本支持主流大模型(讯飞星火、文心一言、通义千问、腾讯混元、Azure、MiniMax、Gemini)

支持主流大模型(讯飞星火、文心一言、通义千问、腾讯混元、Azure、MiniMax、Gemini) [新功能] 系统全局消息提示 UI 全新优化 [新功能] JS 库增加【ijs】类型字符串,支持默认可执行代码 [新功能] 分类快捷操作工具类 CategoryUtil [新功能…...

抖音视频评论区用户采集工具使用教程

抖音视频评论区用户采集工具是一款用于收集抖音视频评论区用户信息的工具。通过该工具,用户可以提取抖音视频评论区的用户昵称、评论内容、点赞数等信息,并进行数据分析和统计。该工具可以帮助用户了解抖音视频评论区的用户特点和评论趋势,提…...

c 不同类型指针的转换

int 指针与unsigned char类型指针互转 #include <stdio.h> #include <stdlib.h>int main(void){int a(0x1<<24)|(0x2<<16)|(0x3<<8)|0x4; //0x1020304printf("16进制:%x\n",a);u_int8_t *p(u_int8_t *)&a; //int指针转为unsig…...

16 PyTorch 神经网络基础【李沐动手学深度学习v2】

1. 模型构造 在构造自定义块之前&#xff0c;我们先回顾一下多层感知机的代码。 下面的代码生成一个网络&#xff0c;其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层&#xff0c; 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 层和块 构造单层神经网咯…...

java数据结构与算法刷题-----LeetCode216. 组合总和 III

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路 此题是77题的扩展题&#xff0c;仅仅加了一个条件而已&…...

vscode remote ssh 连接 ubuntu/linux报错解决方法

1、问题: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fin…...

Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解

1.Normalizer&#xff08;归一化&#xff09;&#xff08;更加推荐使用&#xff09; 优点&#xff1a;将每个样本向量的欧几里德长度缩放为1&#xff0c;适用于计算样本之间的相似性。 缺点&#xff1a;只对每个样本的特征进行缩放&#xff0c;不保留原始数据的分布形状。 公式…...

覆盖element-ui的el-menu样式记录:背景图片、菜单图标、菜单高亮与鼠标悬浮高亮、调整子菜单等样式

页面中修改el-menu 设置background-color"transparent"&#xff0c;menu菜单下的背景图片则能正常显示了 <el-menuclass"el-menu-demo"mode"horizontal"background-color"transparent"><el-menu-item index"1">…...

接口自动化测试从入门到高级实战!

接口测试背景和必要性 接口测试是测试系统组件间接口&#xff08;API&#xff09;的一种测试&#xff0c;主要用于检测内部与外部系统、内部子系统之间的交互质量&#xff0c;其测试重点是检查数据交换、传递的准确性&#xff0c;控制和交互管理过程&#xff0c;以及系统间相互…...

【STC8A8K64D4开发板】第2-14讲:I2C总线的应用

第2-14讲&#xff1a;I2C总线的应用 学习目的了解I2C总线的特点。掌握I2C地址的定义&#xff0c;对I2C地址要有深刻的了解&#xff0c;之后再看到I2C接口设备中描述的7位地址或8位地址&#xff0c;不会再有疑惑。掌握STC8A8K64D4系列单片机I2C的特点以及编程方法。掌握通过I2C读…...

前端框架的发展史

随着互联网技术的飞速发展和用户需求的日益增长&#xff0c;前端开发作为构建用户界面和交互体验的关键环节&#xff0c;经历了从简单到复杂、从静态到动态的演变过程。在这个过程中&#xff0c;前端框架作为提升开发效率和代码质量的重要工具&#xff0c;也经历了多个阶段的发…...

Unity Hololens2开发|(二)MRTK3导入和配置

目录 1.从 MRTK3 模板项目开始2.从新项目开始2.1 创建新的 Unity 项目2.2 使用混合现实功能工具导入所需的依赖项和 MRTK3 包2.3 打开 Unity 项目2.4 在导入后配置 MRTK 配置文件2.5 配置 OpenXR 相关设置2.6 使用模板项目资源1.从 MRTK3 模板项目开始 获取并试用 MRTK3 最简单…...

VMware下载与安装

准备一个Linux的系统&#xff0c;成本最低的方式就是在本地安装一台虚拟机&#xff0c;VMware是业界最好用的虚拟机软件之一 官网&#xff1a;https://www.vmware.com/ 下载页面&#xff1a;https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html …...

9、Linux-安装JDK、Tomcat和MySql

目录 一、安装JDK 1、传输JDK文件&#xff08;.tar.gz&#xff09; 2、解压 3、备份环境变量 4、配置环境变量 5、重新加载环境变量 6、验证&#xff08;java -version&#xff09; 二、安装Tomcat 1、传输文件&#xff0c;解压到/usr/local 2、进入Tomcat的bin目录 …...

深度学习图像算法工程师--面试准备(2)

深度学习面试准备 深度学习图像算法工程师–面试准备&#xff08;1&#xff09; 深度学习图像算法工程师–面试准备&#xff08;2&#xff09; 文章目录 深度学习面试准备前言一、Batch Normalization(批归一化)1.1 具体步骤1.2 BN一般用在网络的哪个部分 二、Layer Normaliza…...

SAP SRM采购管理平台:从战略寻源到供应商协同的全流程解析

1. SAP SRM采购管理平台的核心价值 第一次接触SAP SRM系统是在2015年&#xff0c;当时我参与一个制造业客户的数字化转型项目。这个客户有300多家供应商&#xff0c;每年采购金额超过50亿&#xff0c;但采购流程完全依赖Excel和邮件&#xff0c;经常出现供应商报价丢失、合同版…...

知识加工:从事实表达到可用知识体系

通过知识抽取和知识融合&#xff0c;系统已经能够从多源数据中识别并整理出大量事实表达。但这些事实表达还不等于真正可用的知识图谱。一个可用的知识图谱&#xff0c;不仅要有事实&#xff0c;还要有较稳定的概念结构、可用的推理能力和可靠的质量保障。为此&#xff0c;还需…...

Silanna UV发布TO-39平窗封装UVC LED

Silanna UV 在2026年4月14日宣布&#xff0c;为其高性能 SF1系列&#xff08;235 nm 远-UVC&#xff09;和 SN3系列&#xff08;255 nm 深-UVC&#xff09;LED新增 TO-39平窗封装 选项。核心参数与型号封装形式&#xff1a;TO-39 金属管壳&#xff0c;带平坦石英窗口。适用产品…...

软件工程核心概念与实践指南:从理论到应用

1. 软件工程基础概念解析 软件工程作为一门系统性学科&#xff0c;其核心在于运用工程化方法构建高质量的软件系统。我们先从最基础的定义开始&#xff1a;软件不仅仅是代码的集合&#xff0c;而是由程序、数据和文档构成的三位一体。程序是指令序列&#xff0c;数据是程序处理…...

如何用 writable 属性描述符限制 JavaScript 对象属性修改

writable属性描述符控制对象属性值是否可被重新赋值&#xff0c;需通过Object.defineProperty()设置&#xff1b;设为false后属性值锁定&#xff0c;赋值操作静默失败或抛TypeError&#xff0c;且不可逆除非configurable为true。用 writable 属性描述符可以控制对象属性值是否可…...

从payload.bin到Magisk刷机:一步步教你提取并修补boot.img的完整指南

从payload.bin到Magisk刷机&#xff1a;Android系统镜像解包与内核修补全流程实战 在Android设备定制化领域&#xff0c;获取boot.img并进行修改是解锁设备潜力的关键步骤。无论是为了实现系统级功能扩展、安装Magisk获取root权限&#xff0c;还是进行内核级调试&#xff0c;掌…...

基于上位机控制的液晶电子时钟设计

一、系统概述与核心功能 1. 系统定位 本设计打破传统电子钟“按键调时”的物理局限&#xff0c;采用“上位机&#xff08;PC/平板电脑&#xff09; 下位机&#xff08;STM32嵌入式端&#xff09;”的架构。上位机软件拥有友好的图形界面&#xff08;GUI&#xff09;&#xff0…...

34岁过来人亲述:后端转AI大模型应用开发,这3类人大多半途而废!

我做了8年Java后端&#xff0c;33岁那年&#xff0c;咬咬牙辞了干了5年的稳定工作&#xff0c;一头扎进了AI应用开发这个圈子里。 这一年下来&#xff0c;我踩的坑真的不少&#xff1a;面试的时候被面试官问得哑口无言&#xff0c;熬夜改RAG服务改到崩溃&#xff0c;好不容易做…...

荷兰独立研究者发现机器通过“聊天“自主发现看不见的物理规律

这项由荷兰阿姆斯特丹独立研究者Tomek Kaszyński完成的研究发表于2026年3月&#xff0c;论文编号为arXiv:2604.03266v1&#xff0c;研究成果令人惊叹地展示了人工智能如何通过"聊天"的方式自主发现那些我们肉眼看不见的物理规律。当我们观看一个球从斜坡上滚下来时&…...

从理论到实践:共射极放大电路的设计与调试全攻略

1. 共射极放大电路的核心原理 共射极放大电路之所以被称为"电子工程师的必修课"&#xff0c;关键在于它完美展现了晶体管放大的本质。想象一下&#xff0c;你正在用麦克风唱歌&#xff0c;但声音太小无法让全场听到——这时候就需要一个"声音放大器"。共射…...