在所有 QML 内容可用之前阻止 QML window 出现

Prevent QML window from appearing before all the QML content is available

如何防止我的 QML window 在所有 QML 内容可用之前显示?

在我下面的示例中,在创建 QQmlApplicationEngine 之后会显示一个空的 window,但是在调用 app.exec_() 之前不会显示 QML 内容。我的示例代码中的 time.sleep(1) 夸大了效果。 window 为白色,一秒钟后显示红色背景。

我需要做什么才能在 window 出现时显示所有 QML 内容?或者更确切地说,如何防止 window 在所有 QML 内容准备就绪之前显示?

我 运行 Windows。

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_()

这是我看到的慢动作记录,以 1/8 速度播放,没有 time.sleep()。请注意 window 最初显示时是白色的,然后变为红色(好吧,我的 phone 使其变为橙色)。我希望 window 从可见的第一刻起就变成红色。

WidgetsQML 是 Qt 领域中两个截然不同的野兽。

通常情况下,您不应该将两者混合在一个项目中。在别处阅读更多关于差异和概念的信息。

QApplication Class 是实例化 Qt Widgets 应用程序的方法。引用文档:

QApplication specializes QGuiApplication with some functionality needed for QWidget-based applications. It handles widget specific initialization, finalization.

对于 QML 应用程序,您可以使用裸 QGuiApplication and a QQmlEngine 个实例。重要的是要认识到 Qt 应用程序管理它的生命周期和事件循环,而 Qml 引擎就像应用程序事件循环之上的另一个脚本引擎。

Qt 生态系统中有许多活动部件。我在我的 Telegram blog 中用一张 XMind 大图总结了我的发现。检查渲染。