Бавно стартиране на приложението при динамично попълване на GridView

Опитвам се да попълня GridView чрез динамично попълване на ListModel в QtQuick 2.0 (Qt 5). Работи, но приложението стартира много бавно:

Прозорецът на приложението се появява незабавно, но са необходими около 2 секунди, за да се появи светлосин фон. Дотогава виждам сив фон по подразбиране.

Ако откоментирам двата реда, които са коментирани по-долу, приложението стартира незабавно. Но не ми харесва този хак, защото не мога да разбера защо работи.

Някой има ли идея какво може да не е наред?

Благодаря!

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
    }
}

person Zmey    schedule 09.03.2013    source източник
comment
Как попълвате вашия модел? Чрез множество append обаждания?   -  person hate-engine    schedule 10.03.2013
comment
Да, но се възпроизвежда дори ако има едно извикване за добавяне, точно както в кода по-горе. За да възпроизведете, създайте нов проект QtQuick 2.0 и копирайте и поставете кода в main.qml.   -  person Zmey    schedule 11.03.2013


Отговори (1)


Изглежда като спорен въпрос. Вашият код с некоментирани редове създава модел на списък с един елемент. Вашият onCompleted след това изтрива цялото съдържание от списъка и добавя нов елемент. Изглежда, че или трябва да имате статичен ListModel, дефиниран в QML, или трябва да имате празен модел на списък при стартиране.

Всеки път, когато промените ListModel и той има елементи, които са видими, се случват редица неща. ListModel трябва да актуализира своята вътрешна структура и след това да сигнализира, че се е променила. Тогава вашият мрежов изглед трябва да изобрази отново видими ListElements чрез делегата. Може да се окаже, че актът на две много бързи промени (изчистването и добавянето). Което и двете изискват всички тези действия да бъдат изпълнени след всяко, е твърде много при стартиране. Не забравяйте, че имате само една налична нишка за GUI.

person Deadron    schedule 11.03.2013
comment
Странното е, че моят код с некоментирани редове работи правилно. Така че е точно обратното на това, което изглежда логично. :) - person Zmey; 24.03.2013