3

我正在尝试通过在 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
    }
}
4

1 回答 1

0

这似乎是一个有争议的问题。未注释行的代码创建了一个包含一个元素的列表模型。您的 onCompleted 然后从列表中删除所有内容并附加到一个新元素中。似乎您应该在 QML 中定义一个静态 ListModel,或者在启动时应该有一个空列表模型。

每次更改 ListModel 并且它具有可见的元素时,都会发生许多事情。ListModel 需要更新其内部结构,然后发出它已更改的信号。然后您的网格视图需要通过委托重新呈现可见的 ListElements。可能是两个非常快速的变化(清除和附加)的行为。两者都需要在每个操作之后执行所有这些操作,这在启动时太多了。请记住,您只有一个可用于 gui 的线程。

于 2013-03-11T15:44:59.503 回答