Qt:缓慢启动时显示窗口内容

Qt: display window content on slow startup

本文关键字:窗口 显示 缓慢 启动 Qt      更新时间:2023-10-16

感觉这个问题以前被问了大约一百次(例如这里),但我还没有找到有效的解决方案。。

我有一个Qt5程序(Linux),它需要一些时间(大约2秒)进行初始化。我不想生成线程(有几个原因),在初始化完成之前,程序无论如何都不可用。

当前程序启动,并显示一个黑色窗口,直到初始化完成。

我希望尽快绘制窗口内容,并队列一种完成其余部分的方法,该方法在绘制主窗口后立即执行。

这就是我尝试的:

class my_window : public QMainWindow {
Q_OBJECT
explicit my_window(QWidget *parent = 0) : QMainWindow(parent) {
initializeUI();
/// UI is ready and should be drawn. initializeRest() should 
/// be queued 
/// tried to repaint() or update() the MainWindow and to 'force'
/// processing outstanding events - with no effect
update();
repaint();
QApplication::processEvents();
/// don't call - just queue 
QMetaObject::invokeMethod(this, "initializeRest", Qt::QueuedConnection);
}
void initializeRest() {
// do stuff which takes a while
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}

但是主窗口一直保持黑色,直到执行了initializeRest()为止。

如何告诉Qt在窗口构建完成后立即执行initializeRest()

我可以考虑启动一个计时器(坏的,引入额外的延迟)或一个对某种"WindowDrawn"事件做出反应的事件处理程序(坏的、复杂的)。

Qt的方法是什么?

更新

我还尝试将initializeRest()方法放入main()函数中,如Murphy:所建议的那样

my_window::my_window(QWidget *parent = 0) : QMainWindow(parent) {
initializeUI();
}
int main(int a_argsc, char *a_argsv[]) {
QApplication l_application(a_argsc, a_argsv);
my_window mainWindow;
mainWindow.show();
QApplication::processEvents();
mainWindow.initializeRest();
return l_application.exec();
}

同样的结果:在initializeRest()内等待几秒钟会显示最初的黑色主窗口,并在initializeRest()返回后立即绘制(这对我来说似乎是合乎逻辑的,因为事件循环尚未启动。)

注意:这个建议并不能解决问题;它留在这里是为了完整。

您可以在main():中将启动分成更小的步骤

  1. 创建QApplication实例
  2. 实例化主窗口(我将在此处调用变量mainWindow)。在initializeUI();之后,您可以安全地从代码示例的构造函数中删除所有重新绘制的变通方法
  3. 调用mainWindow.show()以强制显示主窗口,然后调用QApplication::processEvents()以强制处理绘制事件
  4. 完成应用程序的所有其他初始化工作
  5. 像往常一样,通过调用QApplication::exec()来启动事件循环

请注意,对于复杂的应用程序/主窗口实现,按照正确的顺序做每件事可能会非常麻烦;CCD_ 14肯定是不那么乏味的解决方案。

我也有同样的问题。我认为问题不是基于show()函数。尝试运行下一个代码。

如果在boxLayout中添加按钮,应用程序将快速启动。但是,如果我尝试setGeometry(),应用程序需要很长时间才能启动。