Загрузка основного окна графического интерфейса QT / QML замедляет рендеринг заставки

Я использую стек C ++ / Qt / QML для разработки приложения с графическим интерфейсом.

При запуске приложения у меня появляется заставка, которая отображается во время загрузки главного окна. Я хочу, чтобы на заставке отображались обновления (скажем, каждые 200 мс) статуса загрузки главного окна.

Однако загрузка главного окна приводит к прерыванию рендеринга заставки на 200 мс «Это обновление». Код, который замедляет заставку:

this->engine = new QQmlApplicationEngine;
engine->load(QUrl("qrc:/mainWindow.qml")); // This line causes splash screen rendering to lag!

Итак, я подумал, хорошо, я помещу процесс заставки в поток с более высоким приоритетом, чтобы процесс рендеринга / обновления не прерывался «как».

Но … я узнал, что все QQmlApplicationEngine объекты должны быть созданы / использованы в том же потоке, а именно тот, который QApplication (синглтон) создается в.

Я понимаю, что если бы у меня были сложные вычислительные операции, я мог бы поместить их в рабочий поток, но этот сценарий немного отличается, потому что причиной задержки является вызов метода GUI, который Qt не позволяет находиться в отдельная тема.

Как я могу добиться того, чего я хочу, с этим ограничением?

1

Решение

Просто идея (после прочтения исходного кода и документации), а не проверенное решение:

QQmlApplicationEngine объединяет QQmlEngine и QQmlComponent, чтобы обеспечить удобный способ загрузки одного файла QML.

QQmlComponent предоставляет progressChanged () сигнал, который вы можете использовать для обновления вашего заставки.

Я надеюсь, что вы можете достичь того, что вы хотите, если вы можете разделить QQmlApplicationEngine в QQmlComponent, чтобы сначала загрузить QML (используйте progressChanged () или таймер обновить заставку), а затем забросить его в QQmlEngine (имитируя путь QQmlApplicationEngine C: \ Qt \ 5.4 \ Src \ qtdeclarative \ src \ qml \ qml \ qqmlapplicationengine.cpp).

Постскриптум Когда вы сделаете все это, ваш основной цикл должен уже работать, чтобы заставить сигналы работать.

0

Другие решения

Вместо того, чтобы использовать QQmlApplicationEngineдвигатель, вы можете использовать свой собственный. Вы, конечно, можете загрузить все в другом потоке, затем отправить весь движок обратно в основной поток и начать рендеринг там. Просто убедитесь, что ни одно из окон не видно, если у вас есть Window объекты там.

0

По вопросам рекламы [email protected]