gpt4 book ai didi

c++ - 有什么方法可以真正确保 QSplashScreen 已在屏幕上重新绘制?

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:47 24 4
gpt4 key购买 nike

我有一个问题,在 Linux 上使用 Xorg (Ubuntu 14.04) 和 Qt 5.5.1 QSplashScreen 在我进入事件循环之前不会被绘制。即使我多次调用 QApplication::processEvents(),它仍然没有被绘制,即使在 1000 次调用之后,尽管窗口已经在屏幕上,保留了之前的原始像素应用启动,因此实际上是不可见的*。来自 this answer我想到了使用调用 QApplication::processEvents()timed 循环,如下所示:

#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 已经重绘,使其窗口不包含垃圾,然后才继续进行长时间的阻塞加载过程?


* 当我在闪屏后面移动一个窗口时发现了这一点

最佳答案

避免不可知的先验魔术超时的一种方法是等待一个确切的事件:绘画事件。在 X11 上它似乎有延迟。要进行这种等待,我们必须子类化 QSplashScreen 并覆盖 QSplashScreen::paintEvent(),如下所示:

#include <QThread>
#include <QApplication>
#include <QSplashScreen>

class MySplashScreen : public QSplashScreen
{
bool painted=false;

void paintEvent(QPaintEvent* e) override
{
QSplashScreen::paintEvent(e);
painted=true;
}
public:
void ensureFirstPaint() const
{
while(!painted)
{
QThread::usleep(1e3);
qApp->processEvents();
}
}
};

int main(int argc, char** argv)
{
QApplication a(argc,argv);

MySplashScreen splash;
splash.show();
splash.showMessage("Loading...");
splash.ensureFirstPaint();

QThread::usleep(5e6); // simulate slow loading process
splash.showMessage("Finished");

return a.exec();
}

关于c++ - 有什么方法可以真正确保 QSplashScreen 已在屏幕上重新绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50059520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com