Qt QProgressBar不确定

时间:2014-07-10 17:23:22

标签: c++ qt

我的应用程序需要执行一些可能需要一秒钟但可能还需要10分钟的操作。为此,我需要在操作期间显示一个带有不确定QProgressBar的QProgressDialog。

QProgressDialog dlg( this );
dlg.setBar( new QProgressBar() );
dlg->setMaximum( 0 );
dlg->setMinimum( 0 );
dlg.setModal( true );
dlg.show();

//operation ...

dlg.close();

在我的操作过程中,对话框显示,透明,没有进度条,操作完成后关闭。

有谁知道我可以做些什么来显示一个模式对话框,阻止用户与应用程序交互并向用户显示不确定的进度条?

3 个答案:

答案 0 :(得分:5)

我建议您不要创建自己的QProgressBarQProgressDialog内部有自己的栏,并将所有方法从对话框传播到栏。更重要的是,要使您的窗口模式首先使用exec而不是showsetModal(true)。要关闭它,请将一些信号(已完成的工作)连接到cancel()插槽(或者用户必须单击取消按钮)。

QProgressDialog dialog;
dialog.setRange(0,0);
dialog.exec();

答案 1 :(得分:1)

documentation of the QProgressDialogs method setBar状态," ...进度对话框取得了进度条的所有权..."但是我找到了关于完全相同问题的forum post你有。

在该帖子中,用户ShaChris23的最后一个答案指出,可以通过将指针传递给QProgressDialog的构造函数中的QProgressBar来解决此问题,将其设置为父级:< / p>

dlg.setBar( new QProgressBar(&dlg) );

答案 2 :(得分:1)

我认为您可能需要的一件事是在循环输入条目时调用QApplication::processEvents()。 引自QCoreApplication文档:

  

当程序忙于执行长时间操作(例如复制文件)时,您可以偶尔调用此功能。

我认为在这种特殊情况下,除非您致电QProgressDialog,否则应用程序在忙于执行长时间操作时不会更新QApplication::processEvents()的外观。

如果您有固定范围,并且在循环进行时致电setValue()(引自QProgressDialog文档):

  

如果进度对话框是模态的(参见QProgressDialog :: QProgressDialog()),则setValue()调用QApplication :: processEvents()

(我在这里省略了警告,警告这可能导致重新入侵的问题).`

请注意,当我尝试使用您的代码时,它会创建一个对话框,就像您只删除行

时所期望的那样

dlg.setBar( new QProgressBar() );

正如在另一个答案中所说,QProgressDialog有自己的QProgressBar,所以除非你有特殊要求,否则这应该做你需要的。