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
中拖动-也无济于事。
那么这是什么问题,如何解决?还是我们在这里做错了什么?
答案 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
的后代项目,则此解决方案不起作用:项目拖动会导致地图平移。要使其正常工作,至少需要使其兄弟姐妹。