繁体   English   中英

QML MouseArea,触发和传播事件

[英]QML MouseArea, trigger and propagate events

我有一个带有按钮的 QML 组件,......在里面。 我放置了一个覆盖整个组件的 MouseArea,因为无论我在何处单击该组件,我都需要执行一个操作。 但是,我还想执行 MouseArea 后面的操作。

例如,如果我单击组件中的按钮,我想执行 MouseArea 动作,然后执行按钮动作。

Item {

  Button{
    anchors: ...
    onClicked: console.info("Button clicked")
  }

  MouseArea{
    anchors.fill: parent
    propagateComposedEvents: true
    onClicked: console.info("MouseArea clicked")
  }
}

如果propagateComposedEvents: true,则不执行MouseArea onClicked,但执行Button onClicked。 如果为 false,则执行 MouseArea 但不执行 Button onClicked。

我希望同时执行 MouseArea(第一个)和 Button(第二个)信号 onClicked。

您只需要将鼠标的接受属性设置为 false。

Item {

  Button{
    anchors: ...
    onClicked: console.info("Button clicked")
  }

  MouseArea{
    anchors.fill: parent
    propagateComposedEvents: true
    onClicked: {
        console.info("MouseArea clicked");
        mouse.accepted =false;
  }
}

来自MouseArea文档:

如果将propagateComposedEvents 设置为true,则组合事件将自动传播到场景中相同位置的其他MouseArea。 每个事件按堆叠顺序传播到其下方的下一个启用的 MouseArea,向下传播此视觉层次结构,直到 MouseArea 接受该事件。 与按下事件不同,如果没有处理程序存在,组合事件将不会被自动接受。

如果您想专门捕捉鼠标点击其中一个,只需将 MouseArea 移动到 Button 下的 z 水平即可。 或者,只需将其定义移到 Button 之前。

Item {
  MouseArea{
    anchors.fill: parent
    onClicked: console.info("MouseArea clicked")
  }

  Button{
    anchors: ...
    onClicked: console.info("Button clicked")
  }
}

或者:

Item {
  Button{
    anchors: ...
    onClicked: console.info("Button clicked")
    z: 1
  }

  MouseArea{
    anchors.fill: parent
    onClicked: console.info("MouseArea clicked")
    z: 0
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM