Медленный запуск приложения при динамическом заполнении 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 через делегат. Может случиться так, что действие двух очень быстрых изменений (очистить и добавить). Которые оба требуют, чтобы все эти действия выполнялись после каждого, слишком много при запуске. Помните, что у вас есть только один поток, доступный для графического интерфейса.

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