使用QProgressDialog的简单示例:为什么这不能正常工作的任何想法?

Chr*_*rys 8 qt

我试图用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;
}
Run Code Online (Sandbox Code Playgroud)

Mac*_*cke 14

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

只需在for循环中添加以下内容,并阅读其文档以了解更多使用场景:

 QApplication::processEvents();
Run Code Online (Sandbox Code Playgroud)

此外,您运行的循环运行速度太快,无法显示任何内容.添加一个睡眠电话或做一些有用的工作,以便看到任何东西.

更新(thx Tim)

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

但在您的情况下,您可能希望包含用户事件以获取取消按钮.

  • 另外,有时你想提供一个参数:`QApplication :: processEvents(QEventLoop :: ExcludeUserInputEvents)`以便只允许内部事件如重绘等.鼠标按键和按键等事件会被延迟,直到执行返回到事件循环.如果您不希望允许用户输入中断操作,这可能是至关重要的.请记住,在这种情况下,用户无法按任何按钮(例如取消按钮). (3认同)