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 忙不工作的主要内容,如果未能解决你的问题,请参考以下文章