Qt QProgressBar 不确定
Posted
技术标签:
【中文标题】Qt QProgressBar 不确定【英文标题】:Qt QProgressBar indeterminate 【发布时间】:2014-07-10 17:23:22 【问题描述】:我的应用程序需要执行一些可能需要一秒钟但也可能需要 10 分钟的操作。为此,我需要在操作期间显示一个带有不确定 QProgressBar 的 QProgressDialog。
QProgressDialog dlg( this );
dlg.setBar( new QProgressBar() );
dlg->setMaximum( 0 );
dlg->setMinimum( 0 );
dlg.setModal( true );
dlg.show();
//operation ...
dlg.close();
在我的操作过程中,对话框出现,是透明的,没有进度条,操作后它会关闭。
有谁知道我可以做些什么来显示一个模式对话框,它会阻止用户与应用程序交互并显示一个不确定的进度条?
【问题讨论】:
为什么你的maximum
和minimum
都是0
?
@Cyber 好吧,我尝试了使用和不使用最小/最大值。我在互联网上的某个地方读到我应该将两者都设置为 0 以显示不确定的进度条。
【参考方案1】:
我建议您不要创建自己的QProgressBar
。 QProgressDialog
内部有自己的栏,并将所有方法从对话框传播到栏。更重要的是,要使您的窗口模式首先使用exec
而不是show
或setModal(true)
。要关闭它,请将(完成工作的)一些信号连接到cancel()
插槽(或者用户必须单击取消按钮)。
QProgressDialog dialog;
dialog.setRange(0,0);
dialog.exec();
【讨论】:
【参考方案2】:我认为您可能需要的一件事是在循环访问您的条目时调用QApplication::processEvents()
。
引用QCoreApplication
docs:
当您的程序忙于执行长时间操作(例如复制文件)时,您可以偶尔调用此函数。
我认为在这种特殊情况下,应用程序在忙于执行长操作时不会更新您的 QProgressDialog
的外观,除非您调用 QApplication::processEvents()
。
如果您有固定范围并且在循环进行时调用setValue()
(引用自QProgressDialog
文档):
如果进度对话框是模态的(参见 QProgressDialog::QProgressDialog()),setValue() 调用 QApplication::processEvents()
(我在这里省略了警告,警告这可能会导致重新进入问题)。`
请注意,当我尝试您的代码时,它会创建一个对话框,就像您只删除该行时所期望的那样
dlg.setBar( new QProgressBar() );
正如在另一个答案中所说,QProgressDialog
有自己的QProgressBar
,所以除非您有特殊要求,否则这应该可以满足您的需求。
【讨论】:
【参考方案3】:documentation of the QProgressDialog
s method setBar
声明“...进度对话框拥有进度条的所有权...”,但我发现 forum post 与您遇到的问题完全相同。
在那篇帖子中,用户 ShaChris23 的最后一个回答指出,这个问题可以通过在 QProgressBar
的构造函数中传递指向您的 QProgressDialog
的指针来解决,将其设置为父级:
dlg.setBar( new QProgressBar(&dlg) );
【讨论】:
以上是关于Qt QProgressBar 不确定的主要内容,如果未能解决你的问题,请参考以下文章
QT:将 QMediaPlayer 连接到 QProgressBar?
QT软件开发之基础控件--2.5.2 QProgressBar进度条
QT5-控件-QProgressBar-进度条-用来做下载进度,文件读取进度还不错