QML上层MouseArea对下层的MouseArea接收positionChange信号的遮挡

我们知道,QML中更上层的MouseArea会阻挡下层的MouseArea接收鼠标信号,我们可以通过设置鼠标穿透来规避这种遮挡。

click事件的遮挡

如果将上层的MouseArea的enable属性设置为false,则不再阻挡鼠标的click事件。

Rectangle {
    anchors.fill: parent

    MouseArea {
        anchors.fill: parent
        onClicked: console.log("点击了底层")
    }

    Rectangle {
        anchors.fill: parent

        MouseArea {
            anchors.fill: parent
            enabled: false
            onClicked: console.log("点击了顶层")
        }
    }
}

点击界面,输出为

qml: 点击了底层

positionChange事件的遮挡

将底层的MouseArea的hoverEnabled设置为true

  1. 顶层的hoverEnabledfalse(默认值),无论其enable属性是什么,则底层可以监听到onPositionChanged
  2. 顶层的hoverEnabledtrue,无论其enable属性是什么,底层都无法监听到onPositionChanged

结论:如果需要底层监听onPositionChanged,需要将顶层的hoverEnabled关闭,而不仅仅是enable

附测试代码:

Rectangle {
    anchors.fill: parent

    MouseArea {
        anchors.fill: parent
        hoverEnabled: true

        enabled: true
        onPositionChanged: console.log("bottom: onPositionChanged")
    }

    Rectangle {
        anchors.fill: parent

        MouseArea {
            anchors.fill: parent
            enabled: false
            hoverEnabled: true
        }
    }
}
posted @ 2022-10-13 15:22  warindy  阅读(574)  评论(0)    收藏  举报