加载主QT/QML GUI窗口减慢了启动画面的渲染速度
Loading of Main QT/QML GUI Window Slows Down Rendering of Splash Screen
我正在使用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
对象在那里。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 如何创建一个空的全局类并在启动时实例化它
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- 使用 std::string () const 函数启动线程或未来
- 使用 GLUT 使用键停止动画?
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- 如何创建线程序列以按照启动顺序执行任务?
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 使用对象数组对 SFML 进行动画处理
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 在挂钩启动新线程时解除挂钩进程
- 程序无法启动,因为缺少 libmpc-3.dll
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- QSerialPort 在应用程序启动之前正在使用中
- 无法在 Arch Linux 中启动虚幻引擎 4
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 如何使用 ctypes 停止和重新启动从 Python 运行的C++代码
- 如何在等待程序启动混乱/ GTK+时制作加载/介绍动画弹出窗口
- 如何从C++启动 QML 动画