Qt QProgressBar indeterminate

Qt QProgressBar indeterminate

本文关键字:indeterminate QProgressBar Qt      更新时间:2023-10-16

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

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

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

有没有人知道我可以做什么来显示一个模态对话框,防止用户与应用程序交互,并显示用户一个不确定的进度条?

我建议你不要创建自己的QProgressBarQProgressDialog内部有自己的条,并将所有的方法从对话框传播到条。更重要的是,要使您的窗口模式使用exec,而不是show,或setModal(true)首先。要关闭它,将一些(完成工作的)信号连接到cancel()插槽(或者用户必须单击取消按钮)。

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

我认为您可能需要的一件事是在遍历条目时调用QApplication::processEvents()。引用自QCoreApplication文档:

你可以偶尔调用这个函数,当你的程序忙于执行一个长时间的操作(例如复制一个文件)。

,我认为在这个特殊的情况下,应用程序不会更新你的QProgressDialog的外观,而它正忙于执行长操作,除非你调用QApplication::processEvents()

如果你有固定的范围,你调用setValue()作为你的循环进行(引用自QProgressDialog文档):

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

(我在这里省略了警告,警告这可能导致重入问题)。'

注意,当我尝试你的代码时,它创建了一个对话框,就像你期望的那样,如果你只删除

dlg.setBar( new QProgressBar() );

正如在另一个答案中所说,QProgressDialog有自己的QProgressBar,所以除非您有特殊要求,这应该做您需要的。

QProgressDialog方法setBar的文档声明,"…进度对话框占据进度条的所有权…",然而我发现一个论坛帖子关于你有完全相同的问题。

在那篇文章中,用户ShaChris23的最后一个答案是,这个问题可以通过在QProgressBar的构造函数中传递指针给你的QProgressDialog来解决,将其设置为父:

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