gpt4 book ai didi

c++ - Qt:在缓慢启动时显示窗口内容

转载 作者:行者123 更新时间:2023-11-28 05:38:23 24 4
gpt4 key购买 nike

感觉这个问题已经被问了大约一百次了(例如 here ),但我还没有找到可行的解决方案..

我有一个 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”事件使用react的事件处理程序(不好,复杂)。

执行此操作的 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() 返回后立即绘制(这对我来说似乎是合乎逻辑的,因为事件循环尚未开始..)

最佳答案

Note: This suggestion doesn't solve the issue; it's left here for completeness.

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

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

请注意,对于复杂的应用程序/主窗口实现,要按正确的顺序执行所有操作可能会变得非常棘手; QSplashScreen 肯定是不那么乏味的解决方案。

关于c++ - Qt:在缓慢启动时显示窗口内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37733108/

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