使用可拖动项目在 QML ListView 中延迟滚动

Delayed scroll in QML ListView with draggable items

前段时间通过以下教程实现了带有可拖动项目的 ListViewhttps://doc.qt.io/qt-5/qml-dynamicview-tutorial.html 所以 ListView 项目委托是 MouseArea

拖动工作正常,但滚动在触摸板上有一些故障(Linux 或 Android 平板电脑):滚动在手指移动 2-3 秒后开始,而不是立即开始。很烦人!尝试了不同的 ListViewFlickable 属性,但没有成功。存在任何解决方案或解决方法吗?

使用鼠标滚轮或笔记本电脑触摸板滚动效果很好 - 立即滚动,用手指 - 出现故障。是编程错误、性能问题还是 Qt problem/bug?

给了我一些更改 cacheBuffer 属性 的提示,我之前延迟了这些提示以避免绑定循环:

    Binding on cacheBuffer {
        value: Math.max((listView.contentItem.height + listView.spacing) *
                        listView.count - listView.height, 0)
        delayed: true   // Prevent intermediary values from being assigned
    }

删除延迟 属性 并修复绑定循环使滚动更加灵敏和快速,但在开始滚动之前仍有 2-3 秒的延迟:

    cacheBuffer: count > 0 ? (contentItem.height + spacing) * count
                           : itemHeight

所以我滚动了一次 - 没有反应。 2-3 秒过去了,第二次滚动 - 工作正常。接下来挖哪里?有任何想法吗?谢谢!

我阅读了一些滚动性能提示:

并得出一些结论。

1。重绑定

并删除一些可能会降低性能的绑定和属性。其中之一是

property real contentHeight: listView.contentHeight

属性 列表项委托及其 on..Change 信号处理程序。在其他处理程序中也进行了一些优化。

2。修复了 cacheBuffer 属性 中 ListView

的值

做一些测试得出动态结论 属性 它可能会导致缓存项目清理,性能下降,并由于项目清理和消失而导致一些其他不需要的副作用。即:

    cacheBuffer: 4096

3。可拖动 MouseArea

中不必要的 属性

将我的 MouseArea (dragArea) 结构和属性的实现与 Qt example origin 进行比较,发现它没有 propagateComposedEvents 属性 - 将其删除并瞧 - 一切正常!!!

这 属性 似乎对用手指在触摸屏上滚动有不良副作用,因为列表可以很好地滚动,并且可以立即用鼠标滚轮或笔记本电脑触摸板滚动。

4.Convert ListViewFlickable

要完全消除缓存,ListView 也可以转换为 Flickable,在 Column 中使用 Repeater

  Flickable {
    Column {
        Repeater {
            model: myItems

            delegate: listItem { }
        }
     }
  }