QML中MouseArea在hoverEnabled模式下无法传递悬停事件如何解决?
解决Qt Quick中MouseArea悬停事件无法传递的问题
这个问题我之前也碰到过,Qt Quick里的悬停事件处理逻辑和点击类事件不太一样——你设置的propagateComposedEvents其实对hover事件不起作用,因为hover事件不属于所谓的「组合事件(composed events)」,组合事件主要指鼠标按下、释放、点击这类有明确生命周期的事件。
你的两个MouseArea是完全重叠的,Qt Quick默认只会把悬停事件发给最顶层的那个(也就是第二个MouseArea,因为它是后创建的,z值更高),所以只有2会被打印。下面给你两种可行的解决方案:
方案1:手动转发信号(简单直接)
适合你的场景,直接在顶层MouseArea的事件处理函数里手动触发底层MouseArea的对应信号:
Window { visible: true width: 640 height: 480 MouseArea{ id: ma1 anchors.fill: parent hoverEnabled: true onPositionChanged: console.log("1") } MouseArea{ id: ma2 anchors.fill: parent hoverEnabled: true onPositionChanged: { console.log("2") // 手动触发第一个MouseArea的positionChanged信号 ma1.positionChanged(mouseX, mouseY) } } }
方案2:使用事件过滤器(灵活扩展)
如果以后需要处理更多类型的事件,或者有多个MouseArea需要转发,用事件过滤器的方式扩展性更好:
Window { visible: true width: 640 height: 480 MouseArea{ id: ma1 anchors.fill: parent hoverEnabled: true onPositionChanged: console.log("1") // 实现事件过滤器函数 function eventFilter(target, event) { // 只处理目标是ma2的鼠标移动(悬停)事件 if (target === ma2 && event.type === Qt.MouseMove) { // 给ma1发送对应的鼠标事件 var forwardEvent = Qt.MouseEvent { type: Qt.MouseMove, x: event.x, y: event.y, buttons: event.buttons, modifiers: event.modifiers } ma1.mouseAreaEvent(forwardEvent) } // 返回false表示不拦截原事件,让ma2正常处理 return false } } MouseArea{ id: ma2 anchors.fill: parent hoverEnabled: true Component.onCompleted: { // 给ma2安装事件过滤器,由ma1来处理 ma2.installEventFilter(ma1) } onPositionChanged: console.log("2") } }
两种方案都能让你同时打印出1和2,根据你的实际场景选就行~
内容的提问来源于stack exchange,提问作者Mehrdad
相关产品推荐
相关产品推荐

