Qt Quick:如何处理 MouseArea 中的悬停类型事件,但让低 z 的 MouseAreas 也处理它们



如果在我的鼠标区域上启用了属性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 中工作方式的各种类似限制促使我为鼠标和键盘事件这样做。

相关内容

  • 没有找到相关文章

最新更新