• 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 仍有这种情况,因此需要大家格外注意。

  • 相关阅读:
    vue3项目,vite+vue3+ts+pinia(8)-开发和生产模式配置+跨域
    证件照尺寸怎么修改?这三个好用的方法你知道吗?
    计算机网络---数据链路层扩展的以太网
    Android中可变帧率VRR
    基于51单片机太阳能热水器控制系统-proteus仿真-程序
    Java设计模式 代理模式(Proxy)
    Python封装一个接收UDP组播的模块
    阿里Nginx替代产品-Tengine安装
    java基于springboot青少年体质健康数据管理与分析系统
    react 输入框输入异常
  • 原文地址:https://blog.csdn.net/u011283226/article/details/128070606