使用可拖动项目在 QML ListView 中延迟滚动
Delayed scroll in QML ListView with draggable items
前段时间通过以下教程实现了带有可拖动项目的 ListView
:https://doc.qt.io/qt-5/qml-dynamicview-tutorial.html 所以 ListView 项目委托是 MouseArea
。
拖动工作正常,但滚动在触摸板上有一些故障(Linux 或 Android 平板电脑):滚动在手指移动 2-3 秒后开始,而不是立即开始。很烦人!尝试了不同的 ListView
或 Flickable
属性,但没有成功。存在任何解决方案或解决方法吗?
使用鼠标滚轮或笔记本电脑触摸板滚动效果很好 - 立即滚动,用手指 - 出现故障。是编程错误、性能问题还是 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 ListView
至 Flickable
要完全消除缓存,ListView
也可以转换为 Flickable
,在 Column
中使用 Repeater
。
Flickable {
Column {
Repeater {
model: myItems
delegate: listItem { }
}
}
}
前段时间通过以下教程实现了带有可拖动项目的 ListView
:https://doc.qt.io/qt-5/qml-dynamicview-tutorial.html 所以 ListView 项目委托是 MouseArea
。
拖动工作正常,但滚动在触摸板上有一些故障(Linux 或 Android 平板电脑):滚动在手指移动 2-3 秒后开始,而不是立即开始。很烦人!尝试了不同的 ListView
或 Flickable
属性,但没有成功。存在任何解决方案或解决方法吗?
使用鼠标滚轮或笔记本电脑触摸板滚动效果很好 - 立即滚动,用手指 - 出现故障。是编程错误、性能问题还是 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 ListView
至 Flickable
要完全消除缓存,ListView
也可以转换为 Flickable
,在 Column
中使用 Repeater
。
Flickable {
Column {
Repeater {
model: myItems
delegate: listItem { }
}
}
}