QtQuick如何将pressed鼠标事件传递给press触发后创建的对象
结论
不能通过默认的propagateComposedEvents机制将本次触发的pressed事件传递给事后创建的对象。
原因说明
Qt Quick的鼠标事件分发逻辑是事件触发前就已经遍历完成当前场景下所有已存在的可接收鼠标事件的对象层级,你在RectA的pressed事件回调中才创建RectB,此时本次事件的分发链已经确定,下层对象列表里根本没有刚创建的RectB,所以哪怕你设置mouse.accepted = false,事件也只会发给事件触发时已经存在的下层对象,不会给到新创建的RectB。
可行实现方案
方案1:手动转发事件给新创建的RectB
你可以在RectB创建完成后,主动调用其MouseArea的pressed信号,将当前鼠标事件对象传递过去,仅需修改你代码中RectA的MouseArea部分即可:
MouseArea{ id: rectAMouseArea anchors.fill: parent propagateComposedEvents: true onPressed:{ console.log("mouse clicked on rectA") loader.sourceComponent = rectBComponent // 监听Loader加载完成后手动转发事件 loader.onLoaded: { loader.item.x = rectA.x loader.item.y = rectA.y loader.item.width = rectA.width loader.item.height = rectA.height console.log("manually passing the mouse event") // 手动触发RectB的MouseArea的pressed信号 loader.item.rectBMouseArea.pressed(mouse) } } }
方案2:提前创建RectB默认隐藏,点击时再显示
如果你不想手动转发事件,可以提前初始化RectB,默认设置visible: false,点击RectA时再设置其可见,此时RectB在本次事件触发时已经存在于场景层级中,设置mouse.accepted = false就可以正常触发事件传播:
// 提前声明RectB,默认隐藏 Rectangle{ id:rectB color:"green" width: 50 height: 50 z: -1 visible: false MouseArea{ id:rectBMouseArea anchors.fill: parent onPressed:console.log("rect B received press event") } } // RectA的MouseArea修改为 MouseArea{ id: rectAMouseArea anchors.fill: parent propagateComposedEvents: true onPressed:{ console.log("mouse clicked on rectA") rectB.visible = true rectB.x = rectA.x rectB.y = rectA.y mouse.accepted = false // 此时事件可以正常传播给已存在的RectB } }
内容的提问来源于stack exchange,提问作者Mohankumar Char
相关产品推荐
相关产品推荐

