MouseArea窃取了QML元素的鼠标事件

比尔盖*_*尔盖子 11 qml

如果我放置一个MouseAreaQML元素,那么MouseArea将窃取所有鼠标事件.因此,TextEdit将是不可编辑和不可选择的.

TextEdit {
    // some properties
    MouseArea {
        // some properties
        OnClicked: { /* do something */ }
    }
}
Run Code Online (Sandbox Code Playgroud)

有办法解决吗?

顺便说一句,如果我把一个大的MouseArea放在另一个上MouseArea,更大的MouseArea将窃取所有鼠标事件.我该如何解决?我认为手动传递鼠标事件可以解决这个问题,但是怎么做呢?

szo*_*aki 22

您必须启用将MouseArea组合事件传播到clicked或下released传到组件,如@ Torgeirl的答案所述.

如果你想你的TextEdit,Slider或者CheckBox接收这些类型的事件,仅仅通过其设置通过事件accepted属性false.

示例代码:

RowLayout {
    TextEdit { text: "Hi" }
    Slider {}
    CheckBox { text: "CheckBox"}

    MouseArea {
        anchors.fill: parent
        propagateComposedEvents: true

        onClicked: mouse.accepted = false;
        onPressed: mouse.accepted = false;
        onReleased: mouse.accepted = false;
        onDoubleClicked: mouse.accepted = false;
        onPositionChanged: mouse.accepted = false;
        onPressAndHold: mouse.accepted = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当我遇到这个问题时,我正在寻找解决其他问题的方法,并且我想我会指出有一些信号处理程序设置`mouse.accepted = false`没有效果(搜索`MouseArea` docs for`没有任何效果`找到它们全部). (3认同)
  • 如果我想持续更新 mouseX 和 mouseY,则此解决方案不起作用。更改上面示例代码中的 TextEdit 以显示鼠标 X、Y 位置,您将看到只要按住鼠标按钮,它就会停止更新。在 onPressed 中设置“mouse.accepted = false”会导致在释放按钮之前不会更新 MouseArea 属性。不确定这是否是一个错误? (2认同)

小智 5

有一个属性propagateComposedEvents,允许MouseArea通过鼠标事件,如clicked().您必须event.accepted = false在事件处理程序中设置.

有关更多信息和示例,请参阅文档MouseArea和属性propagateComposedEvents.