Qml 中的那些坑(四)---MouseArea 的 Click / Hover 事件穿透

2024-06-03 20:58

本文主要是介绍Qml 中的那些坑(四)---MouseArea 的 Click / Hover 事件穿透,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【写在前面】

        我们在 Qml 中经常会遇到这样的情况:

        有某个 Item ( 这里称为 Parent ),需要它在鼠标 Enter 时显示,鼠标 Exit 时隐藏。

        这时候我们会用一个 MouseArea,然后处理 onEntered / onExited

        但是,有一个巨大的坑:

        如果这个 Item 里嵌入了其他 Item ( 这里称为 Child ) 并且处理自己的 MouseArea,则会导致 Parent ItemMouseArea 失效 ( 即不能接收到相应的事件 )。

        本篇主要内容:

        1、MouseArea 的 Click / Press / Release 事件穿透一般方法;

        2、MouseArea 的 Hover 事件穿透以及所有鼠标事件穿透的终极解决方法;


【正文开始】

        对于 Click / Press / Release 事件,MouseArea 提供了一个属性:

propagateComposedEvents:bool

此属性保存组合的鼠标事件是否将自动传播到与此 MouseArea 重叠但在视觉堆叠顺序中较低的其他 MouseArea

默认情况下,此属性为 false。

MouseArea 包含几个组成的事件:clickeddoubleClicked pressAndHold

它们由基本的鼠标事件(如按下)组成,并且与基本事件相比可以以不同的方式传播。

如果 propertyComposedEvents 设置为 true,则组合事件将自动传播到场景中相同位置的其他 MouseAreas

每个事件将按照堆栈顺序传播到其下方的下一个启用的 MouseArea,并向下传播此可视层次结构,直到 MouseArea 接受该事件为止。

与按下的事件不同,如果没有处理程序,则组合的事件将不会自动被接受。

        具体的使用方法相当简单:

        1、Child ItemMouseArea 设置  propertyComposedEvents true

        2、在相应的事件处理中将 mouse.accepted = false 即可,例如传递 Click 事件:

Rectangle {color: "yellow"width: 100height: 100MouseArea {anchors.fill: parentonClicked: console.log("clicked yellow");}Rectangle {color: "blue"width: 50height: 50MouseArea {anchors.fill: parentpropagateComposedEvents: trueonClicked: {console.log("clicked blue");mouse.accepted = false;}}}
}

        然而,坑爹的是,对于 onEnter onExit,它们没有 mouse 参数 ( 即不能设置 mouse.accepted = false;  ),无法使用此方法传递。

        好在我找到了一种不太常见的方式,但相当简单和实用:

        将 Child Item 直接放入 Parent Item MouseArea 中,类似于这样:

Rectangle {color: "yellow"width: 100height: 100MouseArea {anchors.fill: parentonEntered: {}onExited: {}Rectangle {color: "blue"width: 50height: 50MouseArea {anchors.fill: parentonEntered: {}onExited: {}}}}
}

        来看看实际效果:

        可以看到,上面的小方块没有放在 MouseArea 中,这样导致 Enter / Exit 小方块时会触发紫色大方块的 Exit / Enter 事件。

        而下面则放在 MouseArea 中,表现出了正常的 Hover 效果。

        然而,奇葩的是这个方法只能穿透( 传递 ) Hover 事件。

        那么,如果想要实现 Click / Press / Release / Hover 事件的穿透,只能混用上面的两种方法:

Rectangle {color: "yellow"width: 100height: 100MouseArea {anchors.fill: parentonEntered: {}onExited: {}Rectangle {color: "blue"width: 50height: 50MouseArea {anchors.fill: parentpropagateComposedEvents: trueonPressed: mouse.accepted = false;onReleased: mouse.accepted = false;onClicked: mouse.accepted = false;onEntered: {}onExited: {}}}}
}

         这就是终极解决方案 ( 灰常简单有没有Ծ‸ Ծ  )。


【结语】

        最后,动图的代码比较长,就贴个链接了(多多star呀..⭐_⭐):

        CSDN的:MouseArea的Click/Hover事件穿透-C++文档类资源-CSDN下载

        Github的:https://github.com/mengps/QmlExamples

这篇关于Qml 中的那些坑(四)---MouseArea 的 Click / Hover 事件穿透的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028092

相关文章

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

BT天堂网站挂马事件后续:“大灰狼”远控木马分析及幕后真凶调查

9月初安全团队披露bt天堂网站挂马事件,该网站被利用IE神洞CVE-2014-6332挂马,如果用户没有打补丁或开启安全软件防护,电脑会自动下载执行大灰狼远控木马程序。 鉴于bt天堂电影下载网站访问量巨大,此次挂马事件受害者甚众,安全团队专门针对该木马进行严密监控,并对其幕后真凶进行了深入调查。 一、“大灰狼”的伪装 以下是10月30日一天内大灰狼远控的木马样本截图,可以看到该木马变种数量不

防止缓存击穿、缓存穿透和缓存雪崩

使用Redis缓存防止缓存击穿、缓存穿透和缓存雪崩 在高并发系统中,缓存击穿、缓存穿透和缓存雪崩是三种常见的缓存问题。本文将介绍如何使用Redis、分布式锁和布隆过滤器有效解决这些问题,并且会通过Java代码详细说明实现的思路和原因。 1. 背景 缓存穿透:指的是大量请求缓存中不存在且数据库中也不存在的数据,导致大量请求直接打到数据库上,形成数据库压力。 缓存击穿:指的是某个热点数据在

qml states 状态

states 状态 在QML中,states用于定义对象在不同状态下的属性变化。每个状态可以包含一组属性设置,当状态改变时,这些属性设置会被应用到对象上。 import QtQuick 2.15import QtQuick.Controls 2.15// 定义应用程序的主窗口ApplicationWindow {visible: true // 使窗口可见width: 640 /

QML入门之基本元素

元素分为可视元素与非可视元素,可能元素例如Rectangle、Button等。非可视元素如Timer(定时器)、MouseArea(鼠标区域)等。非可视元素一般用于操作可视元素。 基础元素 Item Item(基础元素对象)是所有可视元素的基础对象,它们都继承自Item。可是元素存在以下共有属性。 Group(分组)Properties(属性)Geometry(几何属性)x

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{