Qt QProgressBar indeterminate
Qt QProgressBar indeterminate
我的应用程序需要执行一些操作,这些操作可能需要一秒钟,但也可能需要10分钟。为此,我需要在操作期间显示一个带有不确定的QProgressBar的QProgressDialog。
QProgressDialog dlg( this );
dlg.setBar( new QProgressBar() );
dlg->setMaximum( 0 );
dlg->setMinimum( 0 );
dlg.setModal( true );
dlg.show();
//operation ...
dlg.close();
在我的操作过程中,对话框显示,是透明的,没有进度条,操作后关闭。
有没有人知道我可以做什么来显示一个模态对话框,防止用户与应用程序交互,并显示用户一个不确定的进度条?
我建议你不要创建自己的QProgressBar
。QProgressDialog
内部有自己的条,并将所有的方法从对话框传播到条。更重要的是,要使您的窗口模式使用exec
,而不是show
,或setModal(true)
首先。要关闭它,将一些(完成工作的)信号连接到cancel()
插槽(或者用户必须单击取消按钮)。
QProgressDialog dialog;
dialog.setRange(0,0);
dialog.exec();
我认为您可能需要的一件事是在遍历条目时调用QApplication::processEvents()
。引用自QCoreApplication
文档:
你可以偶尔调用这个函数,当你的程序忙于执行一个长时间的操作(例如复制一个文件)。
,我认为在这个特殊的情况下,应用程序不会更新你的QProgressDialog
的外观,而它正忙于执行长操作,除非你调用QApplication::processEvents()
。
如果你有固定的范围,你调用setValue()
作为你的循环进行(引用自QProgressDialog
文档):
如果进度对话框是模态的(参见QProgressDialog::QProgressDialog()), setValue()调用QApplication::processEvents()
(我在这里省略了警告,警告这可能导致重入问题)。'
注意,当我尝试你的代码时,它创建了一个对话框,就像你期望的那样,如果你只删除
行 dlg.setBar( new QProgressBar() );
正如在另一个答案中所说,QProgressDialog
有自己的QProgressBar
,所以除非您有特殊要求,这应该做您需要的。
QProgressDialog
方法setBar
的文档声明,"…进度对话框占据进度条的所有权…",然而我发现一个论坛帖子关于你有完全相同的问题。
在那篇文章中,用户ShaChris23的最后一个答案是,这个问题可以通过在QProgressBar
的构造函数中传递指针给你的QProgressDialog
来解决,将其设置为父:
dlg.setBar( new QProgressBar(&dlg) );