如何解决带有可拖动项目的 QML ListView 中的延迟滚动
前段时间通过以下教程实现了带有可拖动项目的 ListView
:https://doc.qt.io/qt-5/qml-dynamicview-tutorial.html 所以 ListView 项目委托是一个 MouseArea
。
拖动工作正常,但是在触摸板(Linux 或 Android 平板电脑)上滚动会出现一些故障:滚动在手指移动 2-3 秒后开始,而不是立即开始。很烦人!尝试了不同的 ListView
或 Flickable
属性但没有运气。是否存在任何解决方案或解决方法?
使用鼠标滚轮或笔记本电脑触摸板滚动工作正常 - 使用手指立即滚动 - 出现故障。是编程错误、性能问题还是 Qt 问题/错误?
This answer 给了我一些修改 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.将ListView
转换为Flickable
为了完全消除缓存,ListView
也可以转换为 Flickable
,并在 Repeater
内使用 Column
。
Flickable {
Column {
Repeater {
model: myItems
delegate: listItem { }
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。