我试图通过动态填充QtQuick 2.0 (Qt 5)中的ListModel来填充GridView。它可以工作,但是应用程序启动非常慢:
应用程序窗口立即出现,但需要大约2秒才能出现浅蓝色背景。在此之前,我看到一个默认的灰色背景。
如果我取消下面注释的两行,应用程序立即启动。但是我不喜欢这个hack,因为我不明白为什么它能工作。
有谁知道哪里出了问题吗?
谢谢!
import QtQuick 2.0
Rectangle {
width: 1024; height: 600
color: "lightblue"
Component.onCompleted: {
//moviesModel.clear()
moviesModel.append({ "movieNumber": 1 })
}
ListModel {
id: moviesModel
//ListElement { movieNumber: 0 }
}
Component {
id: moviesComponent
Rectangle {
width: grid.cellWidth
height: grid.cellHeight
Text {
anchors.centerIn: parent
text: movieNumber
}
}
}
GridView {
id: grid
anchors.fill: parent
cellWidth: 100
cellHeight: 200
model: moviesModel
delegate: moviesComponent
}
}
这似乎是一个有争议的问题。不加注释的代码创建了一个包含一个元素的List Model。然后你的onCompleted从列表中删除所有内容,并添加一个新元素。看起来你应该在QML中定义一个静态的ListModel,或者你应该在启动时有一个空的列表模型。
每当你改变一个ListModel并且它有可见的元素时,就会发生很多事情。ListModel需要更新它的内部结构,然后发出改变的信号。然后你的网格视图需要通过委托重新呈现可见的listelement。这可能是两个非常快速的变化(清除和追加)的行为。这两者都需要在每个操作之后执行所有这些操作,这在启动时太多了。请记住,您只有一个线程可用于gui。