C++ 加载主QT/QML GUI窗口会减慢启动屏幕的渲染速度
我正在使用C++/Qt/QML堆栈开发GUI应用程序 在应用程序启动时,我有一个启动屏幕,在主窗口加载时显示。我希望启动屏幕提供主窗口加载状态的更新(比方说,每200毫秒更新一次) 但是,加载主窗口会导致启动屏幕的200ms“this is the update”(这是更新)渲染中断。降低启动屏幕速度的代码是:C++ 加载主QT/QML GUI窗口会减慢启动屏幕的渲染速度,c++,multithreading,qt,splash-screen,C++,Multithreading,Qt,Splash Screen,我正在使用C++/Qt/QML堆栈开发GUI应用程序 在应用程序启动时,我有一个启动屏幕,在主窗口加载时显示。我希望启动屏幕提供主窗口加载状态的更新(比方说,每200毫秒更新一次) 但是,加载主窗口会导致启动屏幕的200ms“this is the update”(这是更新)渲染中断。降低启动屏幕速度的代码是: this->engine = new QQmlApplicationEngine; engine->load(QUrl("qrc:/mainWindow.qml")); //
this->engine = new QQmlApplicationEngine;
engine->load(QUrl("qrc:/mainWindow.qml")); // This line causes splash screen rendering to lag!
所以我想,好吧,我将把启动屏幕进程放到一个优先级更高的线程中,这样它的渲染/更新进程就不会被“as”中断
但是…我发现所有的QQmlApplicationEngine
对象都必须在同一个线程中创建/使用,即QApplication
中创建的对象(单例)
我知道如果我有大量的计算操作,我可以把它们放到一个工作线程中,但是这个场景有点不同,因为导致延迟的是一个GUI方法调用,Qt不允许在一个单独的线程中
有了这个限制,我怎样才能实现我想要的呢?只是一个想法(在阅读了源代码和文档之后),而不是一个经过测试的解决方案:
将QQmlEngine和QQmlComponent组合在一起,以提供加载单个QML文件的方便方法
QQmlComponent提供可用于更新初始屏幕的信号
如果您可以将QQmlApplicationEngine分离到QQmlComponent中,首先加载一个QML(使用progressChanged()或a来更新初始屏幕),然后将其放入Qqmlingine(模仿QQmlApplicationEngine C:\Qt\5.4\Src\qtdeclarative\Src\QML\qmlApplicationEngine.cpp的方式),我希望您能够实现您想要的目标
另外,当您执行所有这些操作时,您的主循环应该已经运行,以便使信号工作。只是一个想法(在阅读源代码和文档之后),而不是经过测试的解决方案:
将QQmlEngine和QQmlComponent组合在一起,以提供加载单个QML文件的方便方法
QQmlComponent提供可用于更新初始屏幕的信号
如果您可以将QQmlApplicationEngine分离到QQmlComponent中,首先加载一个QML(使用progressChanged()或a来更新初始屏幕),然后将其放入Qqmlingine(模仿QQmlApplicationEngine C:\Qt\5.4\Src\qtdeclarative\Src\QML\qmlApplicationEngine.cpp的方式),我希望您能够实现您想要的目标
另外,当您执行所有这些操作时,您的主循环应该已经在运行,以便使信号工作。您可以使用自己的引擎,而不是使用
QQmlApplicationEngine
的引擎。您当然可以在另一个线程中加载所有内容,然后将整个引擎返回到主线程并在那里开始渲染。如果有Window
对象,请确保所有窗口都不可见。您可以使用自己的引擎,而不是使用qqqmlapplicationengine
的引擎。您当然可以在另一个线程中加载所有内容,然后将整个引擎返回到主线程并在那里开始渲染。如果你有Window
对象,只需确保所有窗口都不可见。谢谢你的想法,我会在几天后回家后试用!谢谢你的想法,我会在几天内尝试一下,一旦我回家!“使用您自己的引擎”是什么意思?@gbmhunter实例化一个QQmlEngine
并使用它。您所说的“使用您自己的引擎”是什么意思?@gbmhunter实例化一个QQmlEngine
并使用它。