[Qt][Qt 事件][下]详细讲解
目录
- 1.定时器
- 0.是什么?
- 1.QTimerEvent
- 2.QTimer
- 3.获取系统⽇期及时间
- 2.事件分发器
- 1.概述
- 2.事件分发器工作原理
- 3.使用
- 3.事件过滤器
- 0.是什么?
- 2.使用
1.定时器
0.是什么?
- 在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定时器就可以实现
- 定时器:就是在间隔⼀定时间后,去执⾏某⼀个任务
- Qt中的定时器分为
QTimerEvent和QTimer这2个类
1.QTimerEvent
QTimerEvent:⽤来描述⼀个定时器事件- 使用:
startTimer():开启⼀个定时器- 参数:以毫秒为单位的整数作为参数来表明设定的时间
- 返回值:一个整形的身份标识,代表这个定时器
- 当定时器溢出时(即定时时间到达)就可以在
timerEvent()中获取该定时器的编号来进⾏相关操作 killTimer:关闭定时器
- 注意:如果一个程序中存在多个定时器(
startTimer创建的定时器),此时每个定时器都会触发timerEvent() - 示例:
// 构造函数中 {// 开启定时器事件.// 此处 timerId 是一个定时器的身份标识.timerId = this->startTimer(1000); }void Widget::timerEvent(QTimerEvent* event) {// 先判定一下这次触发是否是想要的定时器触发的.if (event->timerId() != this->timerId) {return;}int value = ui->lcdNumber->intValue();if (value <= 0) {// 停止定时器this->killTimer(this->timerId);return;}value -= 1;ui->lcdNumber->display(value); }
2.QTimer
QTimer底层是QTimerEventQTimer:实现⼀个定时器,它提供了更⾼层次的编程接⼝- 如:可以使⽤信号和槽,还可以设置只运⾏⼀次的定时器
- 示例:
QTimer* timer = new QTimer(this);connect(ui->btn1, &QPushButton::clicked, [=](){timer->start(1000); });connect(timer, &QTimer::timeout, [=](){static int num = 1;ui->label->setText(QString::number(num++)); });connect(ui->btn2, &QPushButton::clicked, [=](){timer->stop(); });
3.获取系统⽇期及时间
-
在Qt中,获取系统的⽇期及实时时间可以通过
QTimer类和QDateTime类 -
QDateTime类提供了字符串格式的时间,输出格式由toString()⽅法中的format参数列表决定
-
示例:
// 构造函数中 {QTimer* timer = new QTimer(this);connect(ui->btn1, &QPushButton::clicked, [=](){timer->start(1000);});connect(ui->btn2, &QPushButton::clicked, [=](){timer->stop();});connect(timer, &QTimer::timeout, this, &Widget::TimeUpdate); }void Widget::TimeUpdate() {QString t = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");ui->label->setText(t); }
2.事件分发器
1.概述
- 在Qt中,事件分发器(
EventDispatcher)是⼀个核⼼概念,⽤于处理GUI应⽤程序中的事件- 属于Qt事件机制背后的一些逻辑
- 杀伤力比较广,不当使用可能对现有逻辑造成一些负面影响,一般不建议使用
- 事件分发器负责将事件从⼀个对象传递到另⼀个对象,直到事件被处理或被取消
- 每个继承⾃
QObject类或QObject类本⾝都可以在本类中重写bool event(QEvent* e),来实现相关事件的捕获和拦截
2.事件分发器工作原理
- 在Qt中,发送的事件都是传给了
QObject对象,更具体点是传给了QObject对象的event()- 所有的事件都会进⼊到这个函数⾥⾯
- 那么处理事件就要重写这个
event()函数
- 那么处理事件就要重写这个
event()函数本⾝不会去处理事件,⽽是根据事件类型(type)调⽤不同的事件处理函数
- 所有的事件都会进⼊到这个函数⾥⾯
- 事件分发器就是⼯作在应⽤程序向下分发事件的过程中
- 事件分发器⽤于分发事件,在此过程中,事件分发器也可以做拦截操作
- 事件分发器主要是通过
bool event(QEvent* e)来实现- 返回值:若为
ture,代表拦截,不向下分发

- 返回值:若为
3.使用
-
Qt中的事件是封装在
QEvent类中,其所包括的事件类型:
-
示例:拦截鼠标左键单击事件
void Widget::mousePressEvent(QMouseEvent* event) {if(event->button() == Qt::LeftButton){qDebug() << "鼠标左键被按下";} }bool Widget::event(QEvent* ev) {if(ev->type() == QEvent::MouseButtonPress){qDebug() << "Event中鼠标被按下";return true; // 返回true,代表拦截,不向下分发}// 其他事件交给父类处理(默认处理)return QWidget::event(ev); }
3.事件过滤器
0.是什么?
- 在Qt中,⼀个对象可能经常要查看或拦截另外⼀个对象的事件
- 例如:对话框想要拦截按键事件,不让别的组件接收到,或者修改按键的默认值等
- 属于Qt事件机制背后的一些逻辑
- 杀伤力比较广,不当使用可能对现有逻辑造成一些负面影响,一般不建议使用
- Qt创建了
QEvent事件对象之后,会调⽤QObject的event()函数处理事件的分发,可以在event()函数中实现拦截的操作- 由于
event()是protected的,因此,需要继承已有类 - 如果组件很多,就需要重写很多个
event()- 这当然相当⿇烦,更不⽤说重写
event()还得⼩⼼⼀堆问题 - 好在Qt提供了另外⼀种机制来达到这⼀⽬的:事件过滤器
- 这当然相当⿇烦,更不⽤说重写
- 由于
- 事件过滤器是在应⽤程序分发到
event事件分发器之前,再做⼀次更⾼级的拦截

2.使用
- 事件过滤器的⼀般使⽤步骤:
- 安装事件过滤器
- 重写事件过滤器函数:
eventfilter()
- 示例:
{void MyLabel::mousePressEvent(QMouseEvent* event){QString str = QString("鼠标按下: x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << str.toUtf8().data();}void MyLabel::event(QEvent* ev){if(ev->type() == QEvent::MouseButtonPress){QMouseEvent* event = static_cast<QMouseEvent* e>(e);QString str = QString("event中鼠标按下: x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << str.toUtf8().data();return true; // 返回true,代表拦截,不向下分发}// 其他事件交给父类处理(默认处理)return QWidget::event(ev);} } ---------------------------------------------------------------------- {// Widget构造函数中{// 步骤1:给label安装事件过滤器 this:当前窗口安装事件过滤器ui->label->installEventFilter(this);}// 步骤2:重写eventFilter事件bool Widget::eventFilter(QObject* obj, QEvent* e){if(obj == ui->label) // 判断控件{if(e->type == QEvent::MouseButtonPress){QMouseEvent* event = static_cast<QMouseEvent* e>(e);QString str = QString("事件过滤器中鼠标按下: x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << str.toUtf8().data();return true;}}// 其他事件交给父类处理return QWidget::event(ev);} }
相关文章:
[Qt][Qt 事件][下]详细讲解
目录 1.定时器0.是什么?1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么?2.使用 1.定时器 0.是什么? 在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作&…...
八股总结----计算机网络
0.OSI七层模型 自己的理解:应用层:生成HTTP请求报文-----表示层:将请求报文转换成适合网络传输的数据格式,加密压缩编码等-----会话层:管理两个应用程序之间的会话,包括连接中断等------传输层:…...
Laravel 框架开发 ERP 系统,技术选型和分析以及实施计划
目录 技术选型 技术分析 实施计划 实施步骤 可能需要引入的组件包 技术难点及解决方案 基于 Laravel 框架开发 ERP 系统,技术选型和分析以及实施计划需要考虑多个方面: 技术选型 后端框架:Laravel,因为它提供了丰富的功能…...
【Vue3】嵌套路由
【Vue3】嵌套路由 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内…...
pygame小游戏
代码存在一些bug,感兴趣可自行修改,游戏运行后玩法与吃金币游戏类似。(代码及结果比较粗糙,仅供参考) 注:(图片、音乐、音效文件老是上传上传不上,想要可私,也可以自己找…...
.Net Core IIS 程序报错 Access to the path c:\\windows\\TEMP\\poifiles is denied
程序运行报错:Access to the path c:\\windows\\TEMP\\poifiles is denied ,此错误本文介绍两种解决办法,选择适合你的方法即可;一般.Net程序运行方案二可能比较常用。 解决方案一: 从 IIS 访问文件系统 如果您在浏…...
交换机VLAN配置中Tagged与Untagged端口的差异和应用区别
VLAN(虚拟局域网)是一种将局域网设备从逻辑上划分为不同虚拟工作组的技术。它打破了传统局域网在物理位置上的限制,允许网络管理员根据功能、部门或安全需求等因素,将同一物理网络中的设备划分到不同的逻辑网络中。每个VLAN都像一…...
@OneToOne注解的作用
OneToOne 注解在 Java Persistence API (JPA) 中用于定义实体之间的一对一关系。这种关系意味着两个实体之间通过一个唯一键相互关联,即一个实体中的一个字段(通常是主键或唯一字段)对应于另一个实体中的一个字段(也可以是主键或唯…...
vue动画、过渡效果
vue动画、过渡效果 一.动画二.过渡三.多个元素过渡四.第三方库的使用五.总结 一.动画 1.默认.v-enter-active/.v-leave-active, 如果有name则.name-enter-active/.name-leave-active 2.appear意思是一打开页面就 实现动画,是appear"true"的简写 二.过渡 三…...
在 Vue 3 项目中使用 Element UI Plus <el-calendar>组件与时区处理
文章目录 前言简介<el-calendar> 组件组件定制基础自定义内容示例优化点 时区处理时区问题简介获取时区偏移量 下期扩展:自己实现一个<el-calendar> 的思路结语 前言 简介 在 Vue 3 项目开发过程中,我们经常需要对 UI 组件进行定制以满足特…...
【系统架构设计】计算机网络
【系统架构设计】计算机网络 网络架构与协议网络互联模型OSI/RM 结构模型TCP/IP结构模型IPv6 局域网与广域网局域网特点 网络互连与常用设备网络互联设备交换技术路由技术 网络存储技术 网络架构与协议 网络互联模型 OSI/RM 结构模型 1977年,国际标准化组织为适应…...
《中国数据库前世今生》——历史的深度与未来的展望
在探索科技与历史的交织中,我有幸观看了《中国数据库前世今生》这部纪录片。影片开头它不仅是一段技术演进的回顾,更是中国IT领域从跟随到引领的壮丽史诗。后续深刻研读了专家们的深刻讨论,通过这部纪录片,我深刻感受到了数据库技…...
web前端之实现霓虹灯背景魔术卡、旋转的背景动画、模糊效果、边框、变量、filter
MENU 前言效果图htmlstyle 前言 代码段定义一个名为Magic Card的卡片,并通过一系列CSS属性和动画效果来美化和增强该卡片的视觉效果。 效果图 html <div class"card">Magic Card </div>style 代码 property --rotate {syntax: "<a…...
几款免费的时序数据库对比
InfluxDB、TDengine、OpenTSDB、QuestDB都是当前主流的时序数据库,它们在性能、功能、适用场景等方面各有特点。下面将从多个维度对这四个数据库进行对比分析: 一、性能 InfluxDB: 高效的时间序列数据写入性能,自定义TSM引擎&am…...
基于springboot的乐享田园系统
TOC springboot181基于springboot的乐享田园系统 第1章 绪论** 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不…...
深入解析Objective-C中NSParagraphStyle的段落样式处理艺术
标题:深入解析Objective-C中NSParagraphStyle的段落样式处理艺术 在Objective-C的世界中,文本排版是一个复杂但至关重要的话题。NSParagraphStyle作为其中的核心组件,扮演着决定文本段落外观和布局的关键角色。本文将深入探讨NSParagraphSty…...
Qt编程技巧小知识点(2)GPIB缓存区数据读取
文章目录 Qt编程技巧小知识点(2)GPIB缓存区数据读取小结 Qt编程技巧小知识点(2)GPIB缓存区数据读取 大端小端的问题,其主要表现如下例子: 例如:输入为QByteArray str "#14M\xB6q\xC1\n&qu…...
数的个位相加
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。 示例 1: 输入: num 38输出: 2 解释: 各位相加的过程为: 38 --> 3 8 --> 11 11 --> 1 1 --> 2 由于 2 是一位数,所以返回 2。…...
专业技能(挖坑填坑)——MYSQL的索引、日志、事务、存储引擎、锁机制等相关原理
熟悉MySQL的使用,熟悉MYSQL的索引、日志、事务、存储引擎、锁机制等相关原理。 1.mysql索引,索引的底层数据结构实现 索引就是目录可以帮助快速的找到对应的资源。 MySQL默认的InnoDB存储引擎使用的索引底层数据结构是BTree。BTree是一种多路搜索查找树…...
C++(27): 线程池
目录 1. 概述 2. 例程 (1)ThreadPool.h (2)ThreadPool.cpp (3)Start.cpp (4)编译 1. 概述 线程池技术绝不是C独有的,Java和Python都有比较晚完善的线程池构造接口…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
