我创建了一个模拟“图像滑块”的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使用率会增加?
答案 0 :(得分:3)
快速分析显示大多数CPU周期都花费在itemModel.get
中,尝试将内部模型结构转换为JavaScript对象,然后再移回模型。
整体修改模型也将涉及在这种情况下似乎不需要的QtQuick项目创建和删除。
解决此问题的更有效方法是让ListView滚动到下一个图像,而不是在ListView中当前突出显示的位置更改模型:
Timer {
onTriggered:{
listView.incrementCurrentIndex()
}
}
ListView {
id: listView
keyNavigationWraps: true
highlightMoveDuration: 0
...
}
如果您真的需要保持模型修改方式,C++ model可能会避免代价高昂的JavaScript转换。