Я использую стек 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 не позволяет находиться в отдельная тема.
Как я могу добиться того, чего я хочу, с этим ограничением?
Просто идея (после прочтения исходного кода и документации), а не проверенное решение:
QQmlApplicationEngine объединяет QQmlEngine и QQmlComponent, чтобы обеспечить удобный способ загрузки одного файла QML.
QQmlComponent предоставляет progressChanged () сигнал, который вы можете использовать для обновления вашего заставки.
Я надеюсь, что вы можете достичь того, что вы хотите, если вы можете разделить QQmlApplicationEngine в QQmlComponent, чтобы сначала загрузить QML (используйте progressChanged () или таймер обновить заставку), а затем забросить его в QQmlEngine (имитируя путь QQmlApplicationEngine C: \ Qt \ 5.4 \ Src \ qtdeclarative \ src \ qml \ qml \ qqmlapplicationengine.cpp).
Постскриптум Когда вы сделаете все это, ваш основной цикл должен уже работать, чтобы заставить сигналы работать.
Вместо того, чтобы использовать QQmlApplicationEngine
двигатель, вы можете использовать свой собственный. Вы, конечно, можете загрузить все в другом потоке, затем отправить весь движок обратно в основной поток и начать рендеринг там. Просто убедитесь, что ни одно из окон не видно, если у вас есть Window
объекты там.