Qt QProgressBar 不确定进度条

4

我的应用程序需要执行一些操作,这些操作可能需要一秒钟,也可能需要十分钟。为此,我需要在操作期间显示一个带有不确定的QProgressBar的QProgressDialog。

QProgressDialog dlg( this );
dlg.setBar( new QProgressBar() );
dlg->setMaximum( 0 );
dlg->setMinimum( 0 );
dlg.setModal( true );
dlg.show();

//operation ...

dlg.close();

在我的操作过程中,出现了一个对话框, 它是透明的,没有进度条,在操作完成后自动关闭。

有谁知道我该怎么做才能显示一个模态对话框,防止用户与应用程序交互,并向用户显示一个不确定的进度条?


1
你的“最大值”和“最小值”为什么都是0? - Cory Kramer
@Cyber 嗯,我尝试过带和不带最小/最大值。我在互联网上读到,应该将两者都设置为0以显示一个不确定的进度条。 - Davlog
3个回答

5

我建议您不要创建自己的QProgressBarQProgressDialog内部已经有了它自己的进度条,并且将所有对话框方法传递给进度条。此外,为了使您的窗口模态,请使用exec而不是show或者先使用setModal(true)。要关闭它,请将某些信号(完成工作的信号)连接到cancel()插槽(否则用户将不得不单击“取消”按钮)。

QProgressDialog dialog;
dialog.setRange(0,0);
dialog.exec();

2
我认为你可能需要的一件事是,当循环遍历条目时调用 QApplication :: processEvents()。引用自 QCoreApplication 文档:

在程序执行长时间操作(例如复制文件)时,偶尔可以调用此函数。

我认为在这种特殊情况下,应用程序在执行长时间操作时不会更新 QProgressDialog 的外观,除非您调用 QApplication :: processEvents()

如果您有固定的范围并且在进度条上随着循环的进行而调用 setValue()(引用自 QProgressDialog 文档):

如果进度对话框是模态的(参见QProgressDialog :: QProgressDialog()),则setValue()会调用QApplication :: processEvents()

(我在此省略了警告,警告可能会导致重新进入问题。)

请注意,当我尝试您的代码时,它创建了一个对话框,就像您只删除该行时所期望的那样:

dlg.setBar(new QProgressBar());

如另一个答案中所述, QProgressDialog 具有其自己的 QProgressBar ,因此除非您有特殊要求,否则这应该符合您的需求。


1

QProgressDialog的setBar方法的文档说明中提到,“...进度对话框将拥有进度条...”,然而我发现一个论坛帖子讨论了你遇到的完全相同的问题。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接