有2块MouseArea,上层MouseArea接受press事件而位于其下方的MouseArea接受click事件。click被称为组合事件。2方MouseArea各自接受自己的,互不影响。先上代码:
MouseArea {
id: beneath
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
...
}
}
Item {
id: above
anchors {bottom: parent.bottom; left: parent.left}
width: ...
height: ...
MouseArea {
anchors.fill: parent
propagateComposedEvents: true
onPressed: {
...
}
onClicked: {
mouse.accepted = false
}
}
}
由代码可知,通过设置propagateComposedEvents,并在上层(以下简称above)onClicked设置mouse.accepted = false声明click事件并不在此终结,继续往下层(一下简称beneath)传递。如果在above的clicked和pressed以及beneath的clicked打log,发现都被接收到了。
以上我们想要穿透传递的是click。而press则不然,经试验我发现一旦above在onPressed设置mouse.accepted = false,beneath固然能收到pressed和released,但是above只能收到pressed了。也就是说,above不会再有released了!初次我发现这个现象很震惊,通过查阅,这是Qt的设计认为一旦对pressed不感兴趣那默认你对released也不感兴趣了,可以参阅:qt - QML Mousearea onReleased not emitted - Stack Overflow
关于穿透传递还有一点,那就是mouseX/Y的正确性。我们知道mouseX和mouseY是在此MouseArea内部的相对坐标,一个mouseArea使用固然没有问题,但是我发现一旦above传递给beneath后,above接收到的mouseX/Y正确无误但是beneath的mouseX/Y是不对的(假如我们对坐标感兴趣的话)!经查阅在此情况下,可以使用mouse.x/mouse.y而非mouseX/Y。至于为啥可以再探究,我参考的链接是:qt - propagateComposedEvents: mouse data not accurate? - Stack Overflow
好了,我也是仅仅记载我感兴趣的MouseArea透传事件。其它可以参考这篇文章:QML鼠标事件传递(鼠标穿透)_qml中mousearea将鼠标信号继续传递_龚建波的博客-CSDN博客