qml中MouseArea重叠时事件响应问题

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

先看Qt帮助文档中的例子:
搜索propagateComposedEvents
可以看到该例子:

import QtQuick 2.0

Rectangle {
    color: "yellow"
    width: 100; height: 100

    MouseArea {
        anchors.fill: parent
        onClicked: console.log("clicked yellow")
    }

    Rectangle {
        color: "blue"
        width: 50; height: 50

        MouseArea {
            anchors.fill: parent
            propagateComposedEvents: true
            onClicked: {
                console.log("clicked blue")
                mouse.accepted = false
            }
        }
    }
}

鼠标点击了两次,第一次是点击的小矩形,第三次是大矩形。
运行效果:
在这里插入图片描述
可以看到,小矩形的鼠标点击事件传递给了大矩形的MouseArea,大矩形也响应了。第二次点击大矩形,鼠标点击事件没有传递给小矩形(点击的是未重叠部分)。
查看propagateComposedEvents的帮助文档,qt文档中说,propagateComposedEvents的默认值是false,也就是默认不传递鼠标事件。
只有当propagateComposedEvents: true同时mouse.accepted = false时,鼠标事件才传递给下层的MouseArea,备注:前提是上层的鼠标事件有处理函数,但是又需要传递给下层的时,才同时设置这两个参数。
那么我们来看一下mouse.accepted的作用是什么。
当mouse.accepted = false时,告诉下层说:你就当我没处理鼠标的这个事件。
当mouse.accepted = true时,告诉下层说:你就当我已经处理鼠标的这个事件,这个事件,你就不要再管了。

在霍亚飞等人编著的《Qt编程入门》这本书的第134页有这样一段话:

当MouseArea与其他MouseArea项目重叠时,可以设置propagateComposedEvents属性为true时来传播clicked、doubleClicked和pressAndHold等事件。但是只有在MouseArea没有接收这个事件的时候,它们才可以继续向下传播。也就是说,当事件已经在一个MouseArea中进行处理,则需要在其他事件处理器中设置mouse.accepted = false,这样事件才能继续传播。

再举个例子:

import QtQuick 2.0

Rectangle {

	color: "yellow"
	anchors.fill: parent

	MouseArea {
	  anchors.fill: parent
	  onClicked: console.log("clicked yellow")

	  onDoubleClicked: {
		  console.log("double clicked yellow")
		  mouse.accepted = false
	  }
	}

	Rectangle {
	  color: "blue"
	  width: 50; height: 50

	  MouseArea {
		  anchors.fill: parent
		  propagateComposedEvents: true
//              onClicked: {
//                  console.log("clicked blue")
//                  mouse.accepted = false
//              }

		  onDoubleClicked: {
			  console.log("double clicked blue")
			  mouse.accepted = false
		  }
	  }
	}
}

把这个文件保存成test.qml,再用qmlscene进行运行。
运行结果:
当鼠标单击小矩形时,输出:

qml: clicked yellow

当鼠标双击小矩形时,输出:

qml: clicked yellow
qml: double clicked blue
qml: double clicked yellow

也就是说小矩形的鼠标双击事件传递给了下层的MouseArea,单击事件却没有传递给下层。
另外:鼠标双击时,会先有个鼠标点击事件,再有鼠标双击事件。

参考:
https://blog.csdn.net/xi__q/article/details/52199676
https://www.cnblogs.com/SaveDictator/articles/7411894.html
https://www.cnblogs.com/savedictator/articles/7954148.html

QML鼠标事件传递(鼠标穿透) 候,我们的MouseArea区域重叠了,这候默认是最上层的MouseArea接收鼠标事件,而我们可能需要底层也能接收这个事件。虽然可以关联两个MouseArea的信号,但是这种操作局限性比较大,耦合性太强,某个MouseArea并不能被外部所见等等。在Qt Widgets中可以通过setAttribute(Qt::WA_TransparentForMouseEvents,true... 阅读详情

相关推荐

qml坑之鼠标事件传递

相互重叠MouseArea,通过将顶层(child)的MouseArea.propagateComposedEvents设为true,然后在clicked, doubleClicked, pressAndHold事件处理函数里 写 mouse.accepted = false 可以将事件传递给底层(parent)的MouseArea。对于press、release则可以省去propagateComposedEvents一步,只需要mouse.accepted = false 即可。 像clicked, d

Kelvin_Yan的专栏 1930

QML鼠标事件

如果传播复合事件设置为 true,则组合事件将自动传播到场景中同一位置的其他鼠标区域。每个事件都按堆叠顺序传播到其下方的下一个启用的 MouseArea,向下传播此可视层次结构,直到 MouseArea 接受该事件。与事件不同,如果不存在处理程序,则不会自动接受组合事件。保存组合鼠标事件是否将自动传播到与此鼠标区域重叠但在可视堆叠顺序中较低的其他鼠标区域。默认情况下,此属性为 false。Drag.XAndYAxis 水平和竖直。Drag.YAxis 竖直。Drag.XAxis 水平。

qq_45303986的博客 2159

qml中关于多个MouseArea之间的事件传递(propagateComposedEvent)

import QtQuick 2.0 Rectangle {  color: “yellow”  width: 100; height: 100 MouseArea { anchors.fill: parent onClicked: console.log("clicked yellow") } Rectangle { color: "

happyrabbit456的专栏 2008

Qml重叠(父子)控件同响应鼠标事件

Qml中的父子控件同使用到鼠标事件,相互之间会有干涉,即只能响应父控件的鼠标事件,子控件不能响应。如何使子控件来响应鼠标事件呢? 通过设置MouseArea中的信号:mouse.accept=false。 但只是对于其中的一个方法设置false不起作用,需要将信号中所有参数包含mouse的方法全部设置mouse.accept=false才会起作用。 ...

quietbxj的博客 1622

QML MouseArea 嵌套鼠标点击事件失效问题

QML MouseArea重叠失效问题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...

茉莉呀的博客 3639

QML组件之MouseArea

MouseArea继承于Item且本身不可见,它通常与可见组件结合使用,以便为指定的组件提供鼠标操作的功能。尽管MouseArea拥有visible属性,不过该属性与组件是否可见并没有关系。当visible属性值为false,表示忽略该鼠标区域的鼠标事件,类似enabled属性设置为false。

Y03977211367Y的博客 2348

QML实战:MouseArea的鼠标事件穿透

问题 制作全局的定器,当没有触摸事件超过一定间,退出到登录认证页面。在QML中,item之间是相互堆叠的,后面的item在最上层。因此需要将MouseArea放在最上层,以检查鼠标触摸事件,也因此阻挡了下层item接收鼠标点击。 原因 在MouseArea中有个property:propagateComposedEvents,默认是false, 因此阻止了鼠标事件传递。同在鼠标事件处理中设置mouse.accepted=false, 例: onClicked: { mouse.accepted =

Gulstin的博客 2583

QML MouseArea详解

MouseArea是一个不可见的项目,通常与一个可见的项目一起使用,以便为该项目提供鼠标处理。通过有效地充当代理,鼠标处理的逻辑可以包含在MouseArea项中。常用属性:属性类型描述bool光标当前是否在鼠标区域内。如果为 false,则此属性仅在光标位于 MouseArea按下鼠标为true此鼠标区域的光标形状。mouseXreal这些属性保存了鼠标光标的坐标mouseYreal这些属性保存了鼠标光标的坐标int。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1881

QT-QML:解决多个qml组件重叠表现异常的方法[以mousearea为例]

qml中,经常会遇到多个需要点击的组件重叠,点击重叠部分,结果不符预期的问题。因为某个组件设置anchors.fill;parent,或者其他原因,不该触发的组件被触发,该触发的没反应。我查了很多资料,只是谈mousearea用法,很少有人谈到这个问题。所以,我来简单说一下,避免更多新人像我一样踩坑。

2401_83709388的博客 2765

QML语法基础四

MouseArea没接受事件,才可以继续传递,即当一个事件在MouseArea中处理,需要在其他事件处理器中设置 MouseEvent.acepted=false,该事件才能继续传播。例如1000ms的定器,经过了500ms,突然去改变repeat值,则之前的500ms会重置为0,再过1000ms后才能触发。实现复杂的拖拽事件用到DragEvent,通过x、y获取拖动的位置,使用keys识别数据类型和源的键列表。键盘事件是在键盘上按下一个键就触发,控件的focus设置为true,该控件便有焦点。

小蝈蝈的博客 1365

多层MouseArea执行异常——TextInput无法输入,ComboBox无法弹窗

现象:在TextInput中加入了一个MouseArea后,发现输入框无法再接收鼠标和按键事件,我的代码如下: TextEdit { // properties..... MouseArea { // properties..... OnClicked: { /* do something */ } } } 原因:MouseArea默...

g-xy的博客 717

关于QML中的MouseArea propagateComposedEvents

QMLMouseArea叠加的情况处理方式: 今天在学习QML的过程中,发现一个问题,因为是新手,正在学习,所以难免会碰到各种各样的问题。有些难免很奇葩。先上个代码: import QtQuick 2.8 import QtQuick.Window 2.2 Window { visible: true width:root.width height: root.height title: qsTr("Hello World")//只有加了qsTr才能被国际化的翻译

cattleDrinkRedWine的博客 858

qml-MouseArea

MouseArea 是一个不可见的Item,通常与可见项目结合使用,以便为该项目提供鼠标处理。通过有效地充当代理,鼠标处理的逻辑可以包含在 MouseArea 项中。 enabled 属性用于启用和禁用代理项的鼠标处理。禁用,鼠标区域对鼠标事件变得透明。 MouseArea 是一个不可见的 Item,但它有一个可见的属性。当设置为 false ,鼠标区域对鼠标事件变得透明。 pressed的只读属性指示用户是否在鼠标区域上按住鼠标按钮。此属性...

LIJIWEI0611的博客 1927

QML两个MouseArea重叠在一起导致下方的MouseArea无法获取到鼠标点击事件

QML两个MouseArea重叠在一起导致下方的MouseArea无法获取到鼠标点击事件。

qq_47500842的博客 885

QML MouseArea堆叠传递组合事件

我们知道mouseX和mouseY是在此MouseArea内部的相对坐标,一个mouseArea使用固然没有问题,但是我发现一旦above传递给beneath后,above接收到的mouseX/Y正确无误但是beneath的mouseX/Y是不对的(假如我们对坐标感兴趣的话)!2方MouseArea各自接受自己的,互不影响。一旦above在onPressed设置mouse.accepted = false,beneath固然能收到pressed和released,但是above只能收到pressed了。

brahmsjiang的专栏 504

qml 矩形 rectangle

qml 矩形 rectangle基础代码效果图代码1代码2 border的另一种写法渐变色效果图代码渐变色库资源使用效果图代码antialiasingc(图形保真)属性效果图代码 基础代码 效果图 代码1 注:边框宽度或高度是矩形的大小向里的,假设矩形宽度为100边框宽度为30,那么有效宽度为70 import QtQuick 2.12 import QtQuick.Window 2.12 Window { visible: true width: 350 height: 200

朴勇佑的专栏 1054

QML的Mouse事件(MouseArea)详解

在UI应用程序中,我们常常要处理鼠标事件,一个MouseArea就可以搞定许多事情。MouseArea本身是不可见的,主要和一些可见的元素一起使用,先来看一下它有哪些属性:acceptedButtons:Qt::MouseButtons枚举类型,默认为Qt.leftButton,用来设置有效的鼠标按键,支持按位与“|”操作符,具体按键类型可参考——http://doc.qt.io/qt-5/qt.h

快乐学习,快乐分享 1万+
上一篇: QML中的SmoothedAnimation动画
下一篇: Qt/QML学习资料收集
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值