Qt Quick:如何在MouseArea中处理悬停类型事件,但是让-z-MouseAreas也可以处理它们?

时间:2016-11-11 17:11:19

标签: qt event-handling qml mouseevent qtquick2

如果在我的MouseArea上启用了属性hoverEnabled,我就会收到entered信号的通知,即使当时没有按住鼠标按钮(只是我想要的。)

但是,较低的-Z MouseArea将不会在第一个MouseArea的空间上收到positionChanged事件,因为它们会被第一个MouseArea吃掉。

The Qt docs on positionChanged具体说明:

  

处理此信号时,更改鼠标参数的接受属性无效。

示例代码:

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");
        }
    }
}

" MouseArea 1"永远不会打印。我想要打印两个字符串。

有办法吗?

相关问题提示: This question非常相似,但提问者有2个不同大小的重叠MouseArea,他想要更小的({}更高z)当事件发生在两者之内时吃掉事件。我希望两个重叠的MouseArea都能处理属于这两者的事件。

1 个答案:

答案 0 :(得分:0)

乍一看,它看起来不可能,很可能是因为实施细节限制。通常情况下,传播事件毫不费力,您需要的是处理程序中的propagateComposedEvents: truemouse.accepted = false

但是,虽然这对点击有效,但它对onEntered不起作用。我的第一个想法是,mouse信号缺少entered信号参数,但是positionChanged有它,但它仍然没有按预期工作,如文档说,它没有效果。对于positionChanged而言,clicked实际上是正确的,与sudo apt-get install lamp-server^不同,文档中也说这应该没有效果,但肯定会有效。

此外,即使您将顶部鼠标区域设置得更小,您也可以将光标注册为两者,但位置更改只会注册光标下最顶部的鼠标区域。

我不会说这样的功能是不合理的功能,因此您可能希望提交错误报告并提出修复请求,以便您可以获得常识"行为。但是,如果有的话,这样的修复很可能不会很快到来。

根据您的实际使用情况,可能会有一些变通方法。

最糟糕的情况是,整个应用程序窗口总是只有一个鼠标区域并手动将事件传播到底层对象,它实际上并不像听起来那么乏味,QML中的工作方式有各种类似的限制驱使我为鼠标和键盘事件做到这一点。