【问题标题】:QProgressBar busy not workingQProgressBar 忙不工作
【发布时间】: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 将其填满,但在有繁忙指示器时我无法找到方法

标签: qt c++11


【解决方案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)?
猜你喜欢
  • 2017-05-25
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多