如果在我的鼠标区域上启用了属性hoverEnabled
,即使当时没有按住鼠标按钮(正如我想要的那样(,我也会收到entered
信号的通知。
但是,较低的 z 鼠标区域将不会在第一个鼠标区域的空间上接收位置更改事件,因为它们被第一个鼠标区域吃掉了。
关于positionChanged
的Qt文档特别指出:
处理此信号时,更改鼠标参数的接受属性不起作用。
示例代码:
Item {
width: 100
height: 100
MouseArea {
anchors.fill: parent
hoverEnabled: true
onPositionChanged: {
console.log("MouseArea 1");
}
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: {
console.log("MouseArea 2");
}
}
}
"鼠标区域 1"永远不会打印。我希望打印两个字符串。
有没有办法做到这一点?
相关问题说明:这个问题非常相似,但提问者有 2 个不同大小的重叠MouseArea
s,他希望较小的一个(具有更高的 z(在事件同时属于两者时吞噬事件。我希望两个重叠的MouseArea
来处理属于两者的事件。
乍一看,这似乎是不可能的,很可能是因为实现细节的限制。通常,传播事件毫不费力,您需要的是propagateComposedEvents: true
并在处理程序中mouse.accepted = false
。
但是,虽然这对点击按预期工作,但不适用于onEntered
。我的第一个想法是,entered
信号缺少mouse
信号参数,但是positionChanged
有它,但它仍然没有按预期工作,正如文档所说,它没有影响。与clicked
不同,positionChanged
实际上是如此,文档也说应该没有效果,但肯定有影响。
您也可以为两者注册光标输入,但位置更改将仅注册光标下方最顶部的鼠标区域。
我不会说这样的功能是一个不合理的功能,所以你可能想提交一个错误报告,请求修复它,以便你可以得到"常识"行为。但是,这样的修复可能不会很快到来,如果有的话。
根据您的实际使用方案,可能会有一些解决方法。
最坏的情况是,您始终可以为整个应用程序窗口使用一个鼠标区域,并手动将事件传播到底层对象,这真的不像听起来那么乏味,QML 中工作方式的各种类似限制促使我为鼠标和键盘事件这样做。