在创建其他 window/widgets 时显示进度 window

Showing progress window while creating other window/widgets

我有一个如下所示的函数

void MainWindow::CreateEnvironment()
{
    MdiWindow* sub = createSubWindow();
    MyQTWidget* widget = CreateWidget();
    ..
    ..
}

我希望在此函数中,进度条将在开始时显示,并在函数结束时关闭。 但是添加

void MainWindow::CreateEnvironment()
{
    **progressBarDialog->show();**
    
    MdiWindow* sub = createSubWindow();
    MyQTWidget* widget = CreateWidget();
    ..
    ..
    **progressBarDialog->hide();**

}

不起作用,可能是因为函数需要先退出什么的。 最好的方法是什么?

我假设你使用 QProgressDialog?

您需要首先使用您期望的正确步骤数设置对话框,在它实际显示之前您希望等待多长时间,更重要的是:您需要调用 setValue()更新进度条.

这是我如何解决这个问题的一个例子(据我所知)

void MainWindow::CreateEnvironment()
{
    auto bar = new QProgressBarDialog(this);
    bar->setLabelText(tr("Creating Environment..."));
    bar->setCancelButton(nullptr); // No cancel button
    bar->setRange(0, 10);          // Let's say you have 10 steps
    bar->setMinimumDuration(100);  // If it takes more than 0.1 sec -> show the dialog
    
    bar->setValue(0);
    MdiWindow* sub = createSubWindow();

    bar->setValue(1);
    MyQTWidget* widget = CreateWidget();
    ..
    ..
    bar->setValue(10);
    MyLastWidget* last = CreateLastWidget();

    bar->deleteLater(); // Not needed anymore, let's get rid of it
}

如果对话框从未显示,请不要太担心。除非你正在做非常繁重的计算(例如分配/初始化大量内存),否则创建小部件非常快并且会在 100 毫秒超时之前完成。

编辑:另一件需要注意的事情:QProgressDialog 意味着在主事件循环开始后工作。 (那是在你的 main() 中调用 app.exec() 之后)

如果您打算在 MainWindow 的构造函数中调用此函数,对话框甚至可能永远不会显示,因为 window 本身没有完全创建和运行。

如果您打算稍后调用此函数,当主要 window 已经显示在屏幕上并且用户点击某种 New Document 按钮时:您可以忽略这部分答案.