Запретить появление окна QML до того, как будет доступно все содержимое QML

Как запретить отображение окна QML до тех пор, пока не будет доступно все содержимое QML?

В моем примере ниже показано пустое окно после QQmlApplicationEngine создается, но содержимое QML не появляется до тех пор, пока app.exec_()называется. Эффект усиливается из-за time.sleep(1)в моем примере кода. Окно белое, а через секунду оно показывает красный фон.

Что мне нужно сделать, чтобы все содержимое QML отображалось при появлении окна? Или, скорее, как мне предотвратить отображение окна, пока все содержимое QML не будет готово?

QML

      import QtQuick
import QtQuick.Controls

ApplicationWindow {
    color: "red"
    visible: true
}

Код

      import time
from PySide6 import QtQml, QtWidgets

app = QtWidgets.QApplication([])
engine = QtQml.QQmlApplicationEngine("app_window.qml")

# This sleep exaggerates the issue so that you can easily observe
# that an empty window is shown by this point without QML content.
# Without the sleep the empty window looks like a white "flash"
# before the QML content is shown. I want to get rid of this "flash",
# so I don't want the empty window to ever be visible!
time.sleep(1)

app.exec_()

Я работаю в Windows.

1 ответ

Решение

Виджеты и QML - два разных зверя в стране Qt.

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

Класс QApplication - это способ создания экземпляра приложения Qt Widgets. Ссылаясь на документы:

QApplication специализируется на QGuiApplication с некоторыми функциями, необходимыми для приложений на основе QWidget. Он обрабатывает специфическую инициализацию виджета, финализацию.

Для приложений QML вы используете простые экземпляры QGuiApplication и QQmlEngine . Важно понимать, что приложение Qt управляет своим жизненным циклом и циклом событий, в то время как движок Qml подобен еще одному движку сценариев поверх цикла событий приложения.

В экосистеме Qt много движущихся частей. Я обобщил свои выводы на одной большой диаграмме XMind в моем блоге Telegram . Проверить это отрендерено.

Другие вопросы по тегам