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();

在我的操作过程中,对话框出现,是透明的,没有进度条,操作后它会关闭。

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

【问题讨论】:

为什么你的maximumminimum 都是0 @Cyber​​ 好吧,我尝试了使用和不使用最小/最大值。我在互联网上的某个地方读到我应该将两者都设置为 0 以显示不确定的进度条。 【参考方案1】:

我建议您不要创建自己的QProgressBarQProgressDialog 内部有自己的栏,并将所有方法从对话框传播到栏。更重要的是,要使您的窗口模式首先使用exec 而不是showsetModal(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 QProgressDialogs method setBar 声明“...进度对话框拥有进度条的所有权...”,但我发现 forum post 与您遇到的问题完全相同。

在那篇帖子中,用户 ShaChris23 的最后一个回答指出,这个问题可以通过在 QProgressBar 的构造函数中传递指向您的 QProgressDialog 的指针来解决,将其设置为父级:

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

【讨论】:

以上是关于Qt QProgressBar 不确定的主要内容,如果未能解决你的问题,请参考以下文章

QT:将 QMediaPlayer 连接到 QProgressBar?

QT:QProgressBar 显示文字

QT软件开发之基础控件--2.5.2 QProgressBar进度条

QT5-控件-QProgressBar-进度条-用来做下载进度,文件读取进度还不错

如何在 QT 中获得具有圆形边缘和圆形进度边缘的 QProgressBar?

[Qt]自定义QStyle——实现QProgressBar自定义样式