我的应用程序需要执行一些可能需要一秒钟但可能还需要10分钟的操作。为此,我需要在操作期间显示一个带有不确定QProgressBar的QProgressDialog。
QProgressDialog dlg( this );
dlg.setBar( new QProgressBar() );
dlg->setMaximum( 0 );
dlg->setMinimum( 0 );
dlg.setModal( true );
dlg.show();
//operation ...
dlg.close();
在我的操作过程中,对话框显示,透明,没有进度条,操作完成后关闭。
有谁知道我可以做些什么来显示一个模式对话框,阻止用户与应用程序交互并向用户显示不确定的进度条?
答案 0 :(得分:5)
我建议您不要创建自己的QProgressBar
。 QProgressDialog
内部有自己的栏,并将所有方法从对话框传播到栏。更重要的是,要使您的窗口模式首先使用exec
而不是show
或setModal(true)
。要关闭它,请将一些信号(已完成的工作)连接到cancel()
插槽(或者用户必须单击取消按钮)。
QProgressDialog dialog;
dialog.setRange(0,0);
dialog.exec();
答案 1 :(得分:1)
documentation of the QProgressDialog
s 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
,所以除非你有特殊要求,否则这应该做你需要的。