加载主QT/QML GUI窗口减慢了启动画面的渲染速度

Loading of Main QT/QML GUI Window Slows Down Rendering of Splash Screen

本文关键字:动画 启动 速度 QT QML GUI 窗口 加载      更新时间:2023-10-16

我正在使用c++/Qt/QML栈来开发一个GUI应用程序。

在应用程序启动,我有一个闪屏显示,而主窗口正在加载。我希望闪屏提供更新(比方说,每200ms)到主窗口的加载状态。

然而,主窗口的加载导致200毫秒的"这是更新"的闪屏渲染被中断。使闪屏变慢的代码是:

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

所以我想,好吧,我把闪屏进程放在一个更高优先级的线程中,这样它的渲染/更新进程就不会被"as"中断。

但是…我发现所有的QQmlApplicationEngine对象必须在同一个线程中创建/使用,即创建QApplication(单例)的线程。

我明白,如果我有大量的计算操作,我可以把它们放入一个工作线程,但这种情况有点不同,因为导致延迟的是GUI方法调用,Qt不允许在一个单独的线程中。

如何使用这个限制来实现我想要的?

只是一个想法(在阅读了源代码和文档之后),而不是一个经过测试的解决方案:

QQmlApplicationEngine结合了QQmlEngine和QQmlComponent,提供了一种方便的方式来加载单个QML文件。

QQmlComponent提供progressChanged()信号,你可以用它来更新你的闪屏。

我希望你能实现你想要的,如果你可以分离QQmlApplicationEngine到QQmlComponent加载QML(使用progressChanged()或定时器更新闪屏),然后把它放入QQmlEngine(模仿QQmlApplicationEngine C:Qt5.4Srcqtdeclarative Src QML QML QQmlApplicationEngine .cpp的方式)。

注:当您完成所有这些操作时,您的主循环应该已经运行,以便使信号工作。

不用QQmlApplicationEngine的引擎,你可以用你自己的。你当然可以在另一个线程中加载所有内容,然后将整个引擎运回主线程并在那里开始渲染。只要确保没有窗口是可见的,如果你有Window对象在那里。