【问题标题】:Prevent MouseArea from catching clicks within child rect防止 MouseArea 捕捉子矩形内的点击
【发布时间】:2021-09-26 01:48:02
【问题描述】:

我有一个全屏地图,我在上面添加了一个鼠标区域:

   Map {
      id: map
      anchors.fill: parent
      plugin: osm
      zoomLevel: 16
      minimumZoomLevel: 13
      maximumZoomLevel: 20

      gesture.enabled: true

      Rectangle {
         id: infoPanel
         // ...

         Button {
            // ...
         }
      }

      MouseArea {
         anchors.fill: parent
         onPressed: {
               infoPanel.visible = false
         }
      }

infoPanel 矩形偶尔会显示出来,在地图上覆盖一些信息,以及触发特定操作的按钮。

现在我已将鼠标区域添加到地图中,以便在单击地图时隐藏信息面板,效果很好。

但是,当单击信息面板本身的矩形时,信息面板也会被关闭。

如何防止地图上的鼠标区域干扰infoPanel 内的任何内容?

【问题讨论】:

    标签: qt qml touch-event rectangles mousearea


    【解决方案1】:

    你必须这样做:

    1. 您必须将信息面板的 z 值设置为 map.z + 1 并为信息面板定义鼠标区域以捕获鼠标事件。如下代码

      Map {
          id: map
          anchors.fill: parent
          plugin: osm
          zoomLevel: 16
          minimumZoomLevel: 13
          maximumZoomLevel: 20
          gesture.enabled: true
      
      Rectangle {
          id: infoPanel
          width: 100
          height: 100
          color: "red"
          z: map.z + 1
      
          MouseArea {
              anchors.fill: parent
      
              onClicked: {
                  print("info panel")
              }
          }
      
          Button {
              width: parent.width / 2
              height: width
              anchors.centerIn: parent
              text: "button"
      
              onClicked: {
                  print("button")
              }
          }
      }
      
      MouseArea {
          anchors.fill: parent
      
          onPressed: {
              infoPanel.visible = false
              print("map")
          }
      }
      

      }

    2. 或者只是将鼠标区域移动到信息面板的上方

          Map {
          id: map
          anchors.fill: parent
          plugin: osm
          zoomLevel: 16
          minimumZoomLevel: 13
          maximumZoomLevel: 20
          gesture.enabled: true
      
      MouseArea {
          anchors.fill: parent
      
          onPressed: {
              infoPanel.visible = false
              print("map")
      
          }
      }
      
      Rectangle {
          id: infoPanel
          width: 100
          height: 100
          color: "red"
      
          MouseArea {
              anchors.fill: parent
      
              onClicked: {
                  print("info panel")
              }
          }
      
          Button {
              width: parent.width / 2
              height: width
              anchors.centerIn: parent
              text: "button"
      
      
              onClicked: {
                  print("button")
      
              }
          }
      }
      

      }

    【讨论】:

    • 谢谢,解决方案 1 有效。我昨天尝试了同样的方法,但它不起作用,因为我将MouseArea 放在 QML 中的 Button 之后的信息面板中,这使得按钮不再起作用。我不知道 QML 中元素的顺序很重要,所以首先使用 MouseArea 现在它可以工作了。
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多