【问题标题】:Showing progress window while creating other window/widgets在创建其他窗口/小部件时显示进度窗口
【发布时间】:2021-08-04 07:15:47
【问题描述】:

我有一个如下所示的函数

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

我希望在此功能期间,进度条将在开始时显示并在此功能结束时关闭。 但是添加

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

}

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

【问题讨论】:

    标签: qt qtwidgets


    【解决方案1】:

    我假设你使用 QProgressDialog?

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

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

    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 的构造函数中调用此函数,则对话框甚至可能永远不会显示,因为窗口本身尚未完全创建和运行。

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

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 1970-01-01
      • 2013-12-24
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多