QML:鼠标滚轮事件在ListView中传播

时间:2019-11-20 23:56:45

标签: qt qml qt5 qtquick2 qtquickcontrols2

ListView在鼠标滚轮上滚动时发生奇怪的情况。具有类似于以下内容的项目结构:

MainAppWindow {

    // Some  zoomable map item
    Map {
        anchors.fill: parent
    }

    PopupMenu { // Simple Rectangle item
      anchors.top: parent.top
      width: 200
      height: parent.height / 2
      z: parent.z + 1

      ListView {
        anchors.fill: parent
        clip: true
        ...
        delegate: Item {
          ...
            MouseArea {
                anchors.fill: parent
                onClick: {
                    someHandler()
                }
            }
        }
      }
    }
}
带有 vertical 滚动的

ListView可以正常滚动,直到滚动停在边界(顶部或底部-任意),并且此鼠标事件开始传播之后到基础层,ZoomableMap开始放大,这是我们不希望的:只有在PopupMenu不可见的情况下,才应在此处传播。添加

                onWheel: wheel.accepted = true

放入MouseArea委托中的ListView中可以部分解决问题-禁用滚轮,仅允许通过拖动内容进行滚动。但是最好也允许通过滚轮滚动。 MouseArea中的PopupMenu也会完全阻止轮子并在ListView中拖动-也无济于事。

那么这是什么问题,如何解决?还是我们在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

需要向MouseArea中添加另一个PopupMenu来阻止所有鼠标事件,并且默认情况下处于禁用状态,并且只有在弹出窗口可见时才启用它(可选):

  

已启用:popupMenu.visible

MainAppWindow {

    // Some  zoomable map item
    Map {
        id: map
        anchors.fill: parent
    }

    PopupMenu { // Simple Rectangle item
        id: popupMenu
        anchors.top: parent.top
        width: 200
        height: parent.height / 2
        z: parent.z + 1

        MouseArea {
            id: mapMouseArea
            anchors.fill: parent
            enabled: popupMenu.visible
            preventStealing:true
            hoverEnabled:   true
            onWheel:        { wheel.accepted = true; }
            onPressed:      { mouse.accepted = true; }
            onReleased:     { mouse.accepted = true; }
        }

        ListView {
            anchors.fill: parent
            clip: true
            ...
            delegate: Item {
                ...
                MouseArea {
                    anchors.fill: parent
                    onClick: {
                        someHandler()
                    }
                }
            }
        }
    }
}
  

注意:但是,如果ListView(或任何其他控件)是Map的后代项目,则此解决方案不起作用:项目拖动会导致地图平移。要使其正常工作,至少需要使其兄弟姐妹。