一个Qt鼠标透传场景与事件过滤器的用法

一个Qt鼠标透传场景与事件过滤器的用法

最近工作中遇到一个开发场景,将一个QWidget控件(称为控件A)放入QScrollArea,该控件A重写了QWidget::wheelEvent,根据鼠标滚轮事件缩放内部的绘制视图。当控件过大时,QScrollArea的滚动条出现,此时鼠标滚动也会触发页面滚动,用一个Demo演示:
在这里插入图片描述

问题

对于这个体验问题,提出了一个方案,当按住Ctrl并滚动滚轮,执行控件A的触发缩放逻辑;当没有按Ctrl时,仅滚动页面。但是,由于该控件A是第三方库创建的,无法重写事件处理,所以只能借助Qt事件过滤器或者其他方案。

分析

出现该问题的原因是,控件A重写QWidget::wheelEvent处理缩放,没有将QWheelEvent设置为accepted,即标记为已处理,而Qt对于输入事件(鼠标、键盘等),如果目标控件没有处理,则会将事件投递给其父控件。

因此需要通过事件过滤器,处理控件A的逻辑,不继续透传事件,或者直接透传事件。

基本事件分发流程

Qt分发事件的总入口在QApplication::notify,事件在这里被分发给目标控件。事件分发后,对于Qt的鼠标等事件,会根据事件是否被处理(即QEvent::isAccepted),将未处理的事件透传给当前控件的父控件,或者称之为冒泡。直到其中一个父级控件处理,事件停止透传。

事件分发给目标控件前,会查找目标控件安装的事件过滤器(通过QObject::installEventFilter注册)对象,并按顺序调用其QObject::eventFilter。该方法返回bool值,true则直接返回到QApplication::notify,后续的事件过滤器对象也就不再被调用。

如果所有的事件过滤器对象(QObject::eventFilter)都返回false,则会调用目标控件的QObject::event。对于QWidget,此时会根据事件类型,调用对应的事件处理函数(如 QWidget::wheelEvent)。不同的Qt控件,可能也会重写QWidget::event,在调用其事件处理函数前,执行一些逻辑。

解决方法

首先控件A安装事件过滤器到任意QObject对象,重写该对象的eventFilter方法:

bool Widget::eventFilter(QObject *watched, QEvent *event)
{if(event->type() == QEvent::Wheel && watched == target){if(static_cast<QWheelEvent*>(event)->modifiers() & Qt::CTRL){watched->event(event); 	// 1event->accept();		// 2return true;			// 3}else{event->ignore();		// 4return true;			// 5}}return false;	// 原则上应该调用父类的eventFilter。如果父类没有被安装过滤器,直接false即可
}

代码解释:

  • 1,直接调用QObject::event接口。因为QWidget::event重写时改成protected
  • 2、3,标记事件已被处理,并返回true。按上面说的事件分发流程,回到QApplication::notify,由于事件被处理,鼠标滚轮事件不再继续透传给父控件,分发中断。
  • 4、5,标记事件未处理,返回true,同样回到QApplication::notify,事件透传给父控件。因此跳过了当前控件的处理逻辑。

最终效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python py文件打包成 exe文件

文章目录 安装 pyinstaller 模块pyinstaller 的使用pyinstaller 常用参数多文件打包 安装 pyinstaller 模块 pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple在 pyinstaller 模块安装成功之后&#xff0c;在 Python 的安装目录下的 Scripts 目录下会增加…

Python类练习

文章目录 题目要求步骤 题目要求 1)创建一个 Kid 类&#xff0c;包含姓名&#xff0c;性别&#xff0c;年龄属性和 play 方法 2) 创建一个 Stu 类&#xff0c;继承 Kid 类&#xff0c;同时包含成绩属性&#xff0c;获取成绩方法&#xff0c;努力学习方法&#xff0c;play方法&…

Android13适配-Google官方照片视频选择器

官方照片选择器 图 1. 照片选择器提供了一个直观的界面&#xff0c;便于与您的应用分享照片。 照片选择器的界面可供浏览和搜索&#xff0c;并按日期降序向用户显示其媒体库中的文件。如隐私保护最佳实践 Codelab 中所示&#xff0c;照片选择器为用户提供了一种安全的内置授权…

Nginx配置SSL证书

1 Ubuntu 20.04 上安装 Nginx Nginx 发音 “engine x” ,是一个开源软件&#xff0c;高性能 HTTP 和反向代理服务器&#xff0c;用来在互联网上处理一些大型网站。它可以被用作独立网站服务器&#xff0c;负载均衡&#xff0c;内容缓存和针对 HTTP 和非 HTTP 的反向代理服务器。…

数据结构--插入排序

目录 插入排序 算法实现 算法效率分析 插入排序的优化-折半插入排序 最终的结果&#xff1a;&#xff08;方式&#xff09; 优化-折半查找的代码实现 ​回顾 插入排序 算法实现 算法效率分析 空间复杂度和问题规模无关 插入排序的优化-折半插入排序 之前的元素有序&am…

高端知识竞赛中用到的软件和硬件有哪些

现在单位搞知识竞赛&#xff0c;已不满足于用PPT放题&#xff0c;找几个简单的抢答器、计分牌弄一下了&#xff0c;而是对现场效果和科技感要求更高了。大屏要分主屏侧屏&#xff0c;显示内容要求丰富炫酷&#xff1b;选手和评委也要用到平板等设备&#xff1b;计分要大气些&am…

汽油辛烷值的测定 马达法

声明 本文是学习GB-T 503-2016 汽油辛烷值的测定 马达法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 8 试剂和标准物 8.1 气缸夹套冷却液 若实验室所处海拔的水沸点为100℃1.5℃(212 F3F), 应使用水作为气缸夹套冷却液。当 实验室海拔高度不确定…

S7-1200PLC和LED电子看板通信(TCP/IP)

S7-200SMART PLC和LED电子看板通信应用,请查看下面文章链接: SMART 200 PLC UDP通讯应用LED看板_RXXW_Dor的博客-CSDN博客开放式用户通信 (OUC) 库:数据解析:https://rxxw-control.blog.csdn.net/article/details/121424897这篇博客我们主要介绍S7-1200PLC和LED电子看板通…

java学习--day10 (继承)

文章目录 day9作业今天的内容1.继承1.1.生活中的继承1.2.Java中继承1.3关于父类子类的内存分析1.4重写【重点】1.5重载【overload】 day9作业 1.构造代码块和构造方法的区别 &#xff5b;代码块 &#xff5d; public 类名 () {} 都是实例化一个对象的时候执行的 只不过构造代码…

谷粒商城篇章6 ---- P193-P210 ---- 异步线程池商品详情【分布式高级篇三】

目录 1. 异步 1.1 初始化线程的 4 种方式 1.1.1 继承 Thread 1.1.2 实现 Runnable 接口 1.1.3 实现 Callable 接口 FutureTask 1.1.4 线程池 1.1.5 以上 4 种方式总结&#xff1a; 1.2 线程池详解 1.2.1 初始化线程池的 2 种方式 1.2.1.1 使用 Executors 创建 1.2…

已解决 Rust Error: cannot borrow `x` as mutable more than once at a time

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

深入理解算法的时间复杂度

文章目录 时间复杂度的定义时间复杂度的分类时间复杂度分析常见数据结构和算法的时间复杂度常见数据结构常见算法 常见排序算法说明冒泡排序(Bubble Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort) 时间复杂度的定义 时间复杂度就是一种用来描述算法在输入规…

数据集成:数据挖掘的准备工作之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

Markdown(MD)——Typora Markdown安装教程(2023九月亲测可用!!!)

目录 一、简介 1.Markdown简介 2.Markdown特点 3.Typora简介 二、安装教程 1.下载安装包 2.解压到文件夹 3.安装 4.破解 ​编辑5.激活 三、Markdown常用语法 1.常用语法 2.用于编辑LaTex公式 四、其他编辑器 一、简介 1.Markdown简介 Markdown 是一种轻量级标记语…

【深度学习实验】前馈神经网络(二):使用PyTorch实现不同激活函数(logistic、tanh、relu、leaky_relu)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 定义激活函数 logistic(z) tanh(z) relu(z) leaky_relu(z, gamma0.1) 2. 定义输入、权重、偏置 3. 计算净活性值 4. 绘制激活函数的图像 5. 应用激活函数并…

lv4 嵌入式开发-9 静态库与动态库的使用

目录 1 库的概念 2 库的知识 3 静态库特点 4 静态库 4.1静态库创建 4.2 编译生成目标文件 4.3 创建静态库 hello 4.4 查看库中符号信息 4.5 链接静态库 5 共享库特点 6 共享库 6.1 共享库创建 6.2 编译生成目标文件 6.3 创建共享库 common 6.4为共享库文件创建…

Docker 应用部署

Docker 应用部署 一、部署MySQL 搜索MySQL镜像 拉取MySQL镜像 docker pull mysql:8.0创建容器&#xff0c;设置端口映射&#xff0c;目录映射 # 在root/home/mysql目录下创建MySQL目录用于存储MySQL数据信息 mkdir /root/home/mysql cd /root/home/mysql创建并运行 # 330…

面试官:请说说flex布局_番茄出品.md

面试官&#xff1a;请说说flex布局_番茄出品.md start 依然记得当初学习 flex 布局时&#xff0c;用 flex 布局&#xff1a;画麻将。一筒到九筒&#xff0c;应有尽有。但是光和面试官说&#xff0c;我用 flex 布局画过麻将&#xff0c;并没有什么用。面试官问你一个语法&…

基于SpringBoot+Vue的家具销售电商平台设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

spark6. 如何设置spark 日志

spark yarn日志全解 一.前言二.开启日志聚合是什么样的2.1 开启日志聚合MapReduce history server2.2 如何开启Spark history server 三.不开启日志聚合是什么样的四.正确使用log4j.properties 一.前言 本文只讲解再yarn 模式下的日志配置。 二.开启日志聚合是什么样的 在ya…