我有一个问题,在带有 Xorg(Ubuntu 14.04)和 Qt 5.5.1QSplashScreen
的 Linux 上直到我进入事件循环才被绘制。即使我QApplication::processEvents()
多次调用,它仍然没有被绘制,即使在 1000 次调用之后,虽然窗口已经在屏幕上,保留了应用程序启动之前存在的原始像素,因此实际上是不可见的*。从这个答案中,我想到了使用 call 的定时循环QApplication::processEvents()
,如下所示:
#include <QThread>
#include <QApplication>
#include <QSplashScreen>
int main(int argc, char** argv)
{
QApplication a(argc,argv);
QSplashScreen splash;
splash.show();
splash.showMessage("Loading...");
// The hack to try to ensure that splash screen is repainted
for(int i=0;i<30;++i)
{
QThread::usleep(1e3);
a.processEvents();
}
QThread::usleep(5e6); // simulate slow loading process
splash.showMessage("Finished");
return a.exec();
}
上面的代码主动休眠 30 毫秒以尝试QSplashScreen
重新绘制。这对我有用,但我不确定它是否总是有效,例如在繁忙/缓慢的 CPU 或任何其他条件下(根据经验发现 30 次迭代的神奇值)。
另一种一般来说相当侵入性的方法是在另一个线程中进行所有必要的加载,只是为了确保QSplashScreen
在主线程中确实有一个活动的消息队列。由于需要大量重做主程序,这看起来不是一个很好的解决方案。
那么,有没有什么办法可以确保它QSplashScreen
已经被重新粉刷,使其窗口不包含垃圾,然后才能继续进行长时间的阻塞加载过程呢?
*当我将一个窗口移到启动画面后面时,我发现了这一点