【QT】QT事件Event大全
很高兴在雪易的CSDN遇见你 ,给你糖糖![]()
![]()
![]()
欢迎大家加入雪易社区-CSDN社区云
前言
本文分享QT中的事件Event技术,主要从QT事件流程和常用QT事件方法等方面展开,希望对各位小伙伴有所帮助!
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的点赞就是我的动力(^U^)ノ~YO
目录
前言
1. QEvent事件概述
2.代码说明事件执行流程
QApplication的notify函数
eventTestWidget
zxWidget的eventFilter函数
问题1:子级执行了mousePressEvent,而父级未执行
问题2:如何在notify进行事件拦截
问题3:如何在eventFilter中进行事件拦截
问题4:如何在event中进行拦截
结论:
1. QEvent事件概述
QEvent是QT中所有事件的基类,包括鼠标事件、键盘事件、QPaintEvent重绘事件、Timer事件、Drop事件。
事件的执行过程:由QApplication对象的exec事件循环监听整个界面中所有控件的发生的事件Event。当某个控件产生相关事件后,QApplication对象会执行notify函数,向此控件发送通知。控件收到事件通知后,会进行事件过滤(eventFilter)和事件分发(event)最后到达事件处理函数。
2.代码说明事件执行流程
以Widget为例进行说明

QApplication的notify函数
重写notify函数
bool zxApplication::notify(QObject *obj, QEvent *e)
{if(e->type() == QEvent::MouseButtonPress){qDebug()<<"notify: "<<obj->objectName()<<" "<<e->type()<<endl;//return true;}return QApplication::notify(obj, e);
}
eventTestWidget
void eventTestWidget::mousePressEvent(QMouseEvent *ev)
{qDebug()<<"eventTestWidget::mousePressEvent "<<endl;
}bool eventTestWidget::event(QEvent *event)
{qDebug()<<"eventTestWidget::event "<< event->type()<<endl;return QWidget::event(event);
}bool eventTestWidget::eventFilter(QObject *obj, QEvent *ev)
{if(obj == ui->widget && ev->type()==QEvent::MouseButtonPress){qDebug()<<"eventTestWidget::eventFilter widget "<< ev->type()<<endl;return false;}return QWidget::eventFilter(obj, ev);
}
zxWidget的eventFilter函数
重写eventFilter函数
void zxWidget::mousePressEvent(QMouseEvent *ev)
{qDebug()<<"zxWidget::mousePressEvent "<<endl;QWidget::mousePressEvent(ev);
}bool zxWidget::event(QEvent *event)
{qDebug()<<"zxWidget::event "<< event->type()<<endl;return QWidget::event(event);
}bool zxWidget::eventFilter(QObject *obj, QEvent *ev)
{if(ev->type()==QEvent::MouseButtonPress){qDebug()<<"zxWidget::eventFilter "<< ev->type()<<endl;return false;}return QWidget::eventFilter(obj, ev);
}
当在widget中点击鼠标左键时,触发
//第一步:Application的notify,接收到 mouseBottonPress事件,顺序:父级-》子级
notify: "eventTestWidgetWindow" QEvent::MouseButtonPress notify: "widget" QEvent::MouseButtonPress //第二步:父级窗口eventFilter执行事件过滤
eventTestWidget::eventFilter widget QEvent::MouseButtonPress //第三步:子级窗口event执行事件分发
zxWidget::event QEvent::MouseButtonPress //第四步:子级窗口执行事件
zxWidget::mousePressEvent
问题1:子级执行了mousePressEvent,而父级未执行
解决方案:添加event->ignore();表示将事件继续传输给父级节点。
void zxWidget::keyPressEvent(QKeyEvent *event)
{qDebug()<< this->objectName()<<" keyPress"<<endl;QWidget::keyPressEvent(event);event->ignore();
}
此时的输出:
notify: "eventTestWidgetWindow" QEvent::MouseButtonPress notify: "widget" QEvent::MouseButtonPress eventTestWidget::eventFilter widget QEvent::MouseButtonPress zxWidget::event QEvent::MouseButtonPress zxWidget::mousePressEvent eventTestWidget::event QEvent::MouseButtonPress eventTestWidget::mousePressEvent
问题2:如何在notify进行事件拦截
解决方案:筛选出指定事件后,返回True;
bool zxApplication::notify(QObject *obj, QEvent *e)
{if(e->type() == QEvent::MouseButtonPress){qDebug()<<"notify: "<<obj->objectName()<<" "<<e->type()<<endl;return true;}return QApplication::notify(obj, e);
}
此时输出
notify: "eventTestWidgetWindow" QEvent::MouseButtonPress
*若在QApplication的notify函数中对某个事件进行了拦截,则eventFilter中不会在接收到此函数。子对象也不会接收到该事件的通知。
问题3:如何在eventFilter中进行事件拦截
解决方案:
bool eventTestWidget::eventFilter(QObject *obj, QEvent *ev)
{if(obj == ui->widget && ev->type()==QEvent::MouseButtonPress){qDebug()<<"eventTestWidget::eventFilter widget "<< ev->type()<<endl;return true;}return QWidget::eventFilter(obj, ev);
}
此时输出
notify: "eventTestWidgetWindow" QEvent::MouseButtonPress notify: "widget" QEvent::MouseButtonPress eventTestWidget::eventFilter widget QEvent::MouseButtonPress*在父级的eventFilter中进行事件拦截,则该事件不会传输至子对象。
问题4:如何在event中进行拦截
解决方法
bool zxWidget::event(QEvent *event)
{qDebug()<<"zxWidget::event "<< event->type()<<endl;if(event->type()==QEvent::MouseButtonPress){return true;}return QWidget::event(event);
}
此时输出
notify: "eventTestWidgetWindow" QEvent::MouseButtonPress notify: "widget" QEvent::MouseButtonPress eventTestWidget::eventFilter widget QEvent::MouseButtonPress zxWidget::event QEvent::MouseButtonPress*在事件分发时进行事件拦截,故而没有执行该事件。
结论:
该文主要介绍了QT中事件的传输和拦截机制。
关联资源:QT开发+Event事件机制+事件监控、传输、过滤和分发机制资源-CSDN文库
小伙伴可以联系我获取哦
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的赞赏是我的最最最最大的动力(^U^)ノ~YO

相关文章:
【QT】QT事件Event大全
很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT中的事件Event技术,主要从QT事件流程和常用QT事件方法等方面展开,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易…...
华为云云耀云服务器L实例评测|华为云上安装etcd
文章目录 华为云云耀云服务器L实例评测|华为云上安装etcd一、什么是etcd官方硬件建议 二、华为云主机准备三、etcd安装1. 安装预构建的二进制文件2. 从源代码构建 四、etcd服务注册与发现1. 配置etcd2. 使用systemctl 管理启动etcd服务3. 注册服务4. 发现服务 五、其…...
RDLC动态设置整个表格是否显示
最近有个新的需求:使用RDLC打印,当数据库中能查出数据时,显示表格。没有数据时,不显示整个表格。 1.首先在RDLC中选中表格的任意一列,右键Tablix属性 2.Tablix属性中选中可见性》选中基于表达式显示或隐藏(E)并点开右…...
xp 系统 安装 python 2.7 ide pip
1 下载python http://www.python.org/ftp/python/ python-2.7.2.msi 安装完需要设置环境变量 2 下载 setuptools setuptools-0.6c11.win32-py2.7.exe https://pypi.tuna.tsinghua.edu.cn/simple/setuptools/ 3 下载 pip ,python 2.7 最高支持 pip 20.3.4 https:…...
RabbitMQ生产故障问题分析
1. 问题引发 由某个服务BI-collector-xx队列出现阻塞,影响很整个rabbitMQ集群服务不可用,多个应用MQ生产者服务出现假死状态,系统影响面较广,业务影响很大。当时为了应急处理,恢复系统可用,运维相对粗暴的把…...
12大常用自动化测试工具,请记得转发收藏!
常用自动化测试工具 1、Appium AppUI自动化测试 Appium 是一个移动端自动化测试开源工具,支持iOS 和Android 平台,支持Python、Java 等语言,即同一套Java 或Python 脚本可以同时运行在iOS 和Android平台,Appium 是一个C/S 架构&…...
Android Studio 的aapt2.exe在哪个目录下
一般在:C:\Users\admin\AppData\Local\Android\Sdk\build-tools\30.0.2(不一定是30.0.2,这个得看你的版本) 怎么找: 1.打开Android studio...
【pytest】conftest.py使用
1. 创建test_project 目录 test_project/sub/test_sub.py def test_baidu(test_url):print(fsub {test_url}) test_project/conftest.py 设置钩子函数 只对当前目录 和子目录起作用 import pytest #设置测试钩子函数 pytest.fixture() def test_url():return "http…...
SpringBoot集成Prometheus实现监控
SpringBoot配置Prometheus pom.xml 引入监控以及prometheus依赖 <dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><dependency><groupId>org.springfram…...
【操作系统笔记十】缓存一致性
CPU 核心之间数据如何传播 高速缓存中的值被修改了,那么怎么同步到内存中呢? ① 写直达(Write-Through)② 写回(Write-Back) 写直达(Write-Through) 简单,但是很慢&am…...
lS1028 + 六网口TSN 硬交换+QNX/Linux实时系统解决方案在轨道交通系统的应用
lS1028 六网口TSN 硬交换QNX/Linux实时系统解决方案在轨道交通系统的应用 以下是在轨道交通应用的实物: CPUNXP LS1028A架构双核Cortex-A72主频1.5GHzRAM2GB DDR4ROM8GB eMMCOSUbuntu20.04供电DC 12V工作温度-40℃~ 80℃ 功能数量参数Display Port≤1路支持DP1.3…...
实现字符串反转函数
实现字符串反转 #include <stdio.h> #include <string.h>void reverse(char *str) {int len = strlen(str);...
抽检监测实施
声明 本文是学习GB-T 42893-2023 电子商务交易产品质量监测实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件提供了开展电子商务交易的有形产品质量监测的总则,监测准备、监测实施、监测效果评价 与反馈等过程指导…...
C++中的静态库与动态库
文章目录 静态库构建静态库 动态库构建动态库 它们的不同参考文章 单独提这个 库,我想我们在coding过程中,可能也会知道一两个词,如 标准库、xx库等。库作为一组已编写好、组织好的、可复用的资源接口,可以被用于其他程序。很不…...
UGUI 绘制线段
描述 点击鼠标左键在屏幕上绘制线段 准备 VertexHelper 网格绘制工具类向量、叉乘RectTransformUtility.ScreenPointToLocalPointInRectangleSetVerticesDirtyOnPopulateMesh 思路 鼠标按下,记录线段起点;鼠标持续按下,记录鼠标当前帧的…...
详细学习Mybatis(2)
详细学习Mybatis(2) 一、Mybatis核心配置文件详细解释1.1 environment(环境)1.2 事务管理器(transactionManager)1.3、dataSource(数据源)1.4、properties1.5、mapper 一、Mybatis核…...
LinkedList与链表
目录 一、Arraylist的缺陷 二、链表 2.1 链表的概念和结构 2.2 链表的实现 三、链表面试题 3.1 删除链表中所有值为val的节点 3.2 反转一个单链表 3.3 链表的中间节点 3.4 将有序链表合并 3.5 输出倒数第k个节点 3.6 链表分割 3.7 链表的回文结构 3.8 找两个链表的公共节…...
纳米软件芯片自动化测试系统测试电源芯片稳压反馈的方法
在一些电源芯片或稳压芯片中,通常内部都会有稳压反馈电路,这些电路可以将输入电压通过内部调整后输出一个稳定的输出电压,以满足电路中的稳定电源需求。也就是说芯片的稳压反馈就是内部稳压反馈电路中的电压。 芯片稳压反馈原理介绍 稳压反馈…...
微信小程序之项目基本结构、页面的基础及宿主环境
文章目录 前言一、基本组成结构基本组成小程序页面的组成部分JSON配置文件作用 二、页面基础pagesWXML和HTML的区别WXSS和CSS的区别小程序中js文件分类 三、小程序宿主环境总结 前言 微信小程序的项目基本结构、页面的基础及宿主环境 一、基本组成结构 基本组成 新建一个微信…...
C/C++鸡尾酒疗法 2023年5月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
目录 C/C鸡尾酒疗法 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C鸡尾酒疗法 2020年6月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 鸡尾酒疗法,原指“高效抗…...
企业Agent落地:从0到1搭建员工Agent体系
一、项目背景 某中型企业在数字化转型过程中遇到以下痛点: 合同审批流程平均耗时3天,效率低下员工每天约30%的时间花在重复操作上流程规则散落在员工经验中,难以标准化缺乏统一的操作审计和权限管理 二、落地路径 阶段一:验证…...
机器学习中的过拟合与欠拟合:如何解决模型泛化问题
在人工智能技术飞速发展的当下,机器学习模型在软件测试领域的应用愈发广泛,从自动化测试用例生成到缺陷预测,再到性能瓶颈分析,都离不开机器学习的助力。然而,模型的泛化能力始终是制约其在实际测试场景中发挥作用的关…...
【信号处理】基于高斯函数的Caputo-Fabrizio分数阶导数闭式表达式及其在信号处理中的应用附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量m…...
别再手动分色了!用MaterialIDsRandomGenerator插件5分钟搞定游戏模型贴图规划
游戏美术革命:用MaterialIDsRandomGenerator实现材质ID智能分配 在独立游戏开发中,一把生锈的骑士剑模型正静静躺在3dMax视口中。它的剑刃需要金属质感,剑柄需要皮革纹理,护手部分则需要复杂的雕花细节。传统工作流程中࿰…...
Linux 系统编程 文件篇 (二)
[TOC] Linux 系统编程 文件篇 (二) 1 open 函数介绍 1.1 标记位 上一篇的结尾,我们讲到了我们用的打开文件的库函数其实是封装了,这个 open 的系统调用,然后解释了这个 open 函数的 这个标记位,flags 是一个…...
别再只盯着原理图了!FPGA/SoC硬件工程师必看的RGMII接口PCB布线实战指南(含时序约束与等长规则)
RGMII接口PCB设计实战:从时序规范到千兆以太网稳定通信 在FPGA和SoC硬件开发中,RGMII接口设计一直是工程师们又爱又恨的挑战。爱它的简洁高效——相比GMII接口减少了近一半的引脚数量;恨它的时序敏感——一个看似微小的PCB布线失误就可能导致…...
如何通过编译优化与隐私增强实现浏览器性能飞跃:Thorium项目技术深度解析
如何通过编译优化与隐私增强实现浏览器性能飞跃:Thorium项目技术深度解析 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, links are towa…...
Perplexity新闻搜索失效真相:LLM缓存机制、地域策略与时间戳偏移的三重干扰(内部技术备忘录节选)
更多请点击: https://codechina.net 第一章:Perplexity新闻资讯搜索 Perplexity 是一款以实时性、引用可追溯性和多源聚合为特色的 AI 搜索工具,其“新闻资讯搜索”功能专为技术从业者与研究人员设计,支持按时间范围、可信信源&a…...
瑞萨电子2019年中国市场战略与MCU/SoC产品深度解析
1. 项目概述:一次对特定年份半导体巨头市场策略的深度复盘在半导体这个日新月异的行业里,每年各大厂商的产品发布和市场策略,都像是一张张精心绘制的航海图,指引着下游应用市场的技术风向。今天,我想和大家深入聊聊一个…...
Perplexity本地化查询实战:手把手教你用Ollama+Llama3构建离线知识库(含性能压测数据)
更多请点击: https://intelliparadigm.com 第一章:Perplexity本地服务查询 Perplexity 本地服务查询是指在不依赖云端 API 的前提下,通过本地部署的模型与推理服务(如 Ollama、LM Studio 或 Text Generation WebUI)完…...
