我试图用QProgressDialog做一个简单的例子。因此,我在一个小部件中有一个QPushButton,当我按下它时,一个QProgressDialog出现,一直进行到100,然后隐藏。

我的问题是,如果第二次单击“保存”按钮,QProgressDialog只会出现并消失。

用户按下按钮时调用的我的广告位代码:

progressDialog->show();
progressDialog->setWindowModality(Qt::WindowModal);
for(int i = 0; i <= 100; ++i)
{
    progressDialog->setValue(i);

    if(progressDialog->wasCanceled())
        break;
}

最佳答案

您需要允许GUI更新/重绘自身。它不会在每个setXXX调用上执行此操作,因为它太昂贵且不必要。但是,redraw()事件已排队,因此,如果允许Qt处理事件,则对话框将更新。

只需在您的for循环中添加以下内容,并阅读it's documentation以了解更多使用情况:

 QApplication::processEvents();


另外,您所执行的循环运行太快,无法显示任何内容。添加睡眠呼叫或进行一些有用的工作以查看所有内容。

更新(thx Tim)

您可能想使用QApplication::processEvents( QEventLoop::ExcludeUserInputEvents)禁止用户事件(还有网络事件选项)。它们可能会触发应用程序中的其他部分,并导致重新进入和其他不必要的控制流。

但是在您的情况下,您可能希望包括用户事件以获取“取消”按钮。

08-16 01:19