• Qml中的那些坑(三)---MouseArea上的ListView滚轮事件穿透


    【写在前面】

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

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

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


    【正文开始】

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

    1. import QtQuick 2.15
    2. import QtQuick.Window 2.15
    3. Window {
    4. width: 640
    5. height: 480
    6. visible: true
    7. title: qsTr("Hello World")
    8. Rectangle {
    9. id: scaledRect
    10. width: 100
    11. height: 100
    12. anchors.centerIn: parent
    13. color: "red"
    14. }
    15. MouseArea {
    16. id: mouseArea1
    17. anchors.fill: parent
    18. onWheel: (wheel) => {
    19. if (wheel.angleDelta.y > 0) scaledRect.scale += 0.1;
    20. else if (wheel.angleDelta.y < 0) scaledRect.scale -= 0.1;
    21. print("mouseArea1 wheel event!");
    22. }
    23. }
    24. ListView {
    25. id: listView
    26. width: parent.width * 0.5
    27. height: parent.height * 0.5
    28. anchors.centerIn: parent
    29. clip: true
    30. model: 100
    31. spacing: 5
    32. delegate: Rectangle {
    33. width: listView.width
    34. height: 20
    35. color: "#8000ff00"
    36. Text {
    37. anchors.centerIn: parent
    38. text: index
    39. }
    40. }
    41. }
    42. }

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

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

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

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

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

    1. MouseArea {
    2. width: parent.width * 0.5
    3. height: parent.height * 0.5
    4. anchors.centerIn: parent
    5. onWheel: (wheel) => wheel.accepted = true;
    6. ListView {
    7. id: listView
    8. anchors.fill: parent
    9. clip: true
    10. model: 100
    11. spacing: 5
    12. delegate: Rectangle {
    13. width: listView.width
    14. height: 20
    15. color: "#8000ff00"
    16. Text {
    17. anchors.centerIn: parent
    18. text: index
    19. }
    20. }
    21. }
    22. }

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


    【结语】

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

  • 相关阅读:
    社区型商场/购物中心会员管理方案
    聊聊接入Arbitrum的正确姿势
    芯片洁净间的等级是如何划分的
    解决【无法处理文件xxx,因为它位于 Internet 或受限区域中,或者文件上具有 Web 标记。要想处理这些文件,请删除 Web 标记】问题
    解决这三大问题,运维效率将超90%的医院
    linux安装docker-compose
    Dubbo—— 一个服务既是消费者又是提供者
    你的编程能力从什么时候开始突飞猛进的?
    蜘蛛蜂优化算法SWO求解不闭合MD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)
    关于红包雨功能的探索
  • 原文地址:https://blog.csdn.net/u011283226/article/details/128070606