我创建了一个QML组件,该组件模拟了一个“图像滑块”,该滑块无限期地显示不同的图像。
import QtQuick 2.3
Item {
id: root
// Start auto rotating items
Timer {
interval: 500; running: true; repeat: true
onTriggered:{
itemModel.append(itemModel.get(listView.currentIndex))
itemModel.remove(listView.currentIndex)
}
}
ListView {
id: listView
anchors.fill: parent
interactive: false
model: itemModel
delegate:
Image {
id: bg
width: listView.width
height: listView.height
source: bgSource
asynchronous: true
cache: false
}
}
ListModel {
id: itemModel
ListElement {
bgSource: "ui_elements/images/slideimage01.png"
}
ListElement {
bgSource: "ui_elements/images/slideimage02.png"
}
ListElement {
bgSource: "ui_elements/images/slideimage03.png"
}
}
}
不幸的是,CPU使用率会随着时间的推移不断增加,直到应用程序停止。如果我打印itemModel的“ count”变量,它保持在预期的3。
我像这样运行的应用程序:qmlscene SlideImageTest.qml
。
Qt版本:5.3.2
我使用的三个图像可以在这里找到:
问题
为什么CPU使用率增加?
快速分析表明,大多数CPU周期都花在了上itemModel.get
,试图将内部模型结构转换为JavaScript对象,然后再将其返回模型即可。
整体修改模型还将涉及QtQuick Items的创建和删除,在这种情况下,这似乎不是必需的。
解决此问题的更有效方法是使ListView滚动到下一张图像,而不是在ListView中当前突出显示的位置更改模型:
Timer {
onTriggered:{
listView.incrementCurrentIndex()
}
}
ListView {
id: listView
keyNavigationWraps: true
highlightMoveDuration: 0
...
}
如果您确实需要保留模型修改方式,则C ++模型可能会避免昂贵的转换为JavaScript。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句