Qml中的那些坑(三)---MouseArea上的ListView滚轮事件穿透
创始人
2024-04-14 00:24:10
0

【写在前面】

        最近在 Qml 中使用 MouseArea 时发现了一个奇怪的现象:

        位于 MouseArea 上的 ListView 在处理了滚轮事件的情况下进行滚轮,下面的 MouseArea 却在某些情况下接收到了这个事件。

        按照直觉,ListView 明明有内部的滚轮事件处理,应该阻止事件向下传递才对,然而此时的情况却出乎意料,因此在此记录并附上解决方案。


【正文开始】

        首先,我们来看一个很简单的例子:

import QtQuick 2.15
import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")Rectangle {id: scaledRectwidth: 100height: 100anchors.centerIn: parentcolor: "red"}MouseArea {id: mouseArea1anchors.fill: parentonWheel: (wheel) => {if (wheel.angleDelta.y > 0) scaledRect.scale += 0.1;else if (wheel.angleDelta.y < 0) scaledRect.scale -= 0.1;print("mouseArea1 wheel event!");}}ListView {id: listViewwidth: parent.width * 0.5height: parent.height * 0.5anchors.centerIn: parentclip: truemodel: 100spacing: 5delegate: Rectangle {width: listView.widthheight: 20color: "#8000ff00"Text {anchors.centerIn: parenttext: index}}}
}

        按道理,我在最顶层的 ListView 上滚动鼠标,应当不会影响到下面的的红色方块,然而,事实并非如此:

         可以看到,某些时候我在 ListView 上滑动滚轮,底层的 MouseArea 也会接收并处理滚轮事件。

        一开始,我以为是 ListView 的 spaing 属性( 代理项的间隔 )导致滚轮事件穿透,然而去掉后并没有卵用,问题仍然没有解决。

        不管怎样,这是一个相当坑爹的 BUG( 也许不是,但至少影响到我了 ),那么必须要处理好它。

        这里我用了一点奇怪的写法,但相当有用,方法是增加一个 MouseArea 并处理其滚轮事件( 自己处理总不会穿透了吧!):

    MouseArea {width: parent.width * 0.5height: parent.height * 0.5anchors.centerIn: parentonWheel: (wheel) => wheel.accepted = true;ListView {id: listViewanchors.fill: parentclip: truemodel: 100spacing: 5delegate: Rectangle {width: listView.widthheight: 20color: "#8000ff00"Text {anchors.centerIn: parenttext: index}}}}

        没错,将 ListView 置于一个MouseArea 内即可解决问题。


【结语】

        最后,我发现 Qt6 仍有这种情况,因此需要大家格外注意。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...