不久前,通过以下教程实现了具有可拖放项的ListView
:https://doc.qt.io/qt-5/qml-dynamicview-tutorial.html,因此ListView items委托是MouseArea
。
拖动工作正常,但是滚动在触摸屏(Linux或Android平板电脑)上有一些小故障:滚动是在2-3秒的手指移动后开始的,而不是立即开始的。很烦人!尝试了不同的ListView
或Flickable
属性,但没有成功。有任何解决方案或解决办法吗?
鼠标滚轮或笔记本电脑触控板滚动工作良好-立即滚动,手指-小故障。是编程错误、性能问题还是Qt问题/ 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秒过去了,滚动第二次-工作正常。接下来去哪挖?有什么想法吗?谢谢!
发布于 2021-06-25 01:06:50
我读过一些滚动性能技巧:
得出了一些结论。
1.沉重的装订
并删除一些可能降低性能的绑定和属性。其中之一是
property real contentHeight: listView.contentHeight
属性在列表项委托及其on..Change
信号处理程序中。在其他处理程序中也进行了一些优化。
2.固定cacheBuffer
属性值在ListView
中
通过一些测试,得出具有动态特性的结论,它可能会导致缓存项的出现,导致性能的下降,而由于项目的清理和消失,会导致一些不必要的副作用。即:
cacheBuffer: 4096
3.可拖放MouseArea
中不必要的属性
比较我的MouseArea
(dragArea
)结构和属性的实现与Qt示例原点,发现它没有propagateComposedEvents
属性-删除它和瞧-所有工作都很好!!
这个属性似乎对用手指在触摸屏上滚动产生了不必要的副作用,就像列表用鼠标轮或膝上型电脑的触控板快速地滚动一样。
4.将ListView
转换为Flickable
为了完全消除缓存,还可以将ListView
转换为Flickable
,并在Column
中使用Repeater
。
Flickable {
Column {
Repeater {
model: myItems
delegate: listItem { }
}
}
}
https://stackoverflow.com/questions/68092135
复制相似问题