QProgressBar 忙不工作

Posted

技术标签:

【中文标题】QProgressBar 忙不工作【英文标题】:QProgressBar busy not working 【发布时间】:2017-06-15 12:55:02 【问题描述】:

我正在尝试创建一个QProgressBar 来指示正在执行的操作,我不知道在执行之前完成该操作所需的时间。

现在我有以下内容

QProgressBar DLbar;
DLbar.setMaximum(0);
DLbar.setMinimum(0);
DLbar.show();

我已将最小值和最大值都设置为0,这应该会导致基于Qt documentation 的繁忙指示器:

如果最小值和最大值都设置为 0,则条形图显示忙碌 指标而不是步数的百分比。这很有用,因为 例如,当使用 QNetworkAccessManager 下载项目时, 无法确定正在下载的项目的大小。

当我运行程序时,会显示进度条,但它并没有显示忙碌指示器,而是已满,并且一直保持这种状态,直到操作完成。

我尝试将 DLbar 父窗口设置为主窗口,但出现了同样的问题。

例子:

QProgressBar DLbar;
DLbar.setMaximum(0);
DLbar.setMinimum(0);
DLbar.show();
for( int i=0; i<1000000; i++ )
    qDebug() << i;

【问题讨论】:

您是否在GUI线程中执行长时间操作?如果是这样,请从另一个线程启动它并重试。 无法复制(Linux,Qt5.8)。请编辑您的问题以包含minimal reproducible example。 @G.M.已编辑,在此示例中,栏显示但已满,并且在循环结束之前不会移动(OS X Yosemite,Qt5.7) 您正在阻止事件循环。 Qt 不是这样工作的。创建进度条并设置其参数后,您需要返回事件处理循环。 @G.M.我怎样才能做到这一点?我知道如何使用 QDialogBar 并通过调用 setvalue 将其填满,但在有繁忙指示器时我无法找到方法 【参考方案1】:

基本问题是您不允许Qt 事件循环处理事件。演示的最小示例类似于...

#include <cstdlib>
#include <chrono>
#include <thread>
#include <QApplication>
#include <QProgressBar>

int
main (int argc, char **argv)

  QApplication app(argc, argv);
  QProgressBar DLbar;
  DLbar.setMaximum(0);
  DLbar.setMinimum(0);
  DLbar.show();

  /*
   * The following sleep will prevent any events being processed for 10s...
   */
  std::this_thread::sleep_for(std::chrono::seconds(10));

  /*
   * ...after which we start the event loop and everything should start working.
   */
  exit(app.exec());

如果你打算使用Qt,你真的需要对底层event system有一个深刻的理解。

编辑1:你问...

我仍然不明白为什么即使我使用它也不起作用 循环内的 QCoreApplication::processEvents()。

如果在上面的示例中替换...

exit(app.exec());

与...

while (true)
  QCoreApplication::processEvents();

【讨论】:

好的,我明白了,但我仍然不明白为什么即使我在循环中使用QCoreApplication::processEvents() 它也不起作用。那不应该让酒吧移动吗? 我刚试了你的代码还是不行,我只看到一个完整的进度条不动 “我只看到一个完整的进度条不动”。多长时间?尝试删除对std::this_thread::sleep_for 的调用。 它总是静止不动,已经等了 2 分钟了。删除对睡眠的调用不会改变 while 循环和退出 哪个平台和Qt版本(我是Linux和Qt5.8)?

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

由于 Python 文档字符串注释长度,PyQt QProgressBar 无法正常工作?

即忙不工作[VBA]

Python:QtGui.QProgressBar 颜色

从多个 QThread 更新 QProgressBar

为 QProgressBar 上的图像设置着色

QProgressBar : 在保持 OS 风格的同时改变颜色