Qml中的那些坑(三)---MouseArea上的ListView滚轮事件穿透
创始人
2024-02-23 21:45:42
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 仍有这种情况,因此需要大家格外注意。

相关内容

热门资讯

捡到宝了!泰国上将:中国没要求... 当地时间2025年12月15日,泰国国防部长对于,泰国特种兵在战场缴获大批,柬埔寨军人放弃的,中国制...
涉嫌严重违纪违法,李舜被查 据省纪委监委驻省教育厅纪检监察组、玉溪市监委消息:云南省教育厅教材和语言文字管理处原处长、一级调研员...
原创 鞠... 2025年12月19日,最近身陷流言蜚语的鞠婧祎被拍到低调现身街头,这是她与经纪公司丝芭传媒爆发合约...
广州越秀南路有两人受伤,警方通... 12月19日晚,广州市公安局越秀分局发布警情通报:2025年12月19日17时37分,广州110接群...
原创 金... 最近,大家都注意到特朗普单方面宣布允许英伟达对华出售H200芯片。作为交换,美国政府将对H200的所...
明年起,成都全域禁止使用国Ⅰ及... 12月19日,记者从成都市生态环境局获悉,《成都市人民政府关于调整高排放非道路移动机械禁止使用区域的...
闪电进球!图拉姆1分12秒凌空... 在意大利超级杯半决赛的激烈对抗中,国米与博洛尼亚的较量可谓是一场战术与激情的巅峰对决。开场仅1分12...
美联储“三把手”淡化降息预期:... 智通财经APP获悉,美联储“三把手”、纽约联储主席威廉姆斯表示,目前没有迫切需要进一步调整利率政策,...
上海电信回应“罗永浩吐槽网速” 日前,知名博主罗永浩在朋友圈吐槽,称自己搬到上海开了电信的独享千兆宽带半年多来,绝大多数时候只有不到...
北京预计下周一全天和周五晚高峰... · 各滑雪场和部分大型商圈将成为周末出行热点。 · 工作日早晚高峰通行压力较大,早间学校、医院周边车...