防止在所有 QML 内容可用之前出现 QML 窗口

问题描述

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

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

我需要做什么才能在窗口出现时显示所有 QML 内容?或者更确切地说,如何在所有 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()。注意窗口最初显示时是白色的,然后变成红色(好吧,我的手机变成了橙色)。我希望窗口从可见的第一刻起就变成红色。

QML window appears,first shown as white and then changes to red.

解决方法

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

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

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

QApplication 专门为 QGuiApplication 提供了一些基于 QWidget 的应用程序所需的功能。它处理特定于小部件的初始化、完成。

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

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

Qt App