QProgressDialog Class
QProgressDialog 类用于显示耗时操作的进度反馈。更多内容...
| 头文件: | #include <QProgressDialog> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| 继承自: | QDialog |
- 所有成员列表(包括继承的成员)
- QProgressDialog 属于“标准对话框”组件。
属性
|
公共函数
| QProgressDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()) | |
| QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()) | |
| virtual | ~QProgressDialog() |
| bool | autoClose() const |
| bool | autoReset() const |
| QString | labelText() const |
| int | maximum() const |
| int | minimum() const |
| int | minimumDuration() const |
| void | open(QObject *receiver, const char *member) |
| void | setAutoClose(bool close) |
| void | setAutoReset(bool reset) |
| void | setBar(QProgressBar *bar) |
| void | setCancelButton(QPushButton *cancelButton) |
| void | setLabel(QLabel *label) |
| int | value() const |
| bool | wasCanceled() const |
重新实现的公共函数
| virtual QSize | sizeHint() const override |
公共插槽
| void | cancel() |
| void | reset() |
| void | setCancelButtonText(const QString &cancelButtonText) |
| void | setLabelText(const QString &text) |
| void | setMaximum(int maximum) |
| void | setMinimum(int minimum) |
| void | setMinimumDuration(int ms) |
| void | setRange(int minimum, int maximum) |
| void | setValue(int progress) |
信号
| void | canceled() |
重新实现的受保护函数
| virtual void | changeEvent(QEvent *ev) override |
| virtual void | closeEvent(QCloseEvent *e) override |
| virtual void | resizeEvent(QResizeEvent *event) override |
| virtual void | showEvent(QShowEvent *e) override |
受保护的槽
| void | forceShow() |
详细说明
进度对话框用于向用户指示操作预计需要多长时间,并表明应用程序并未卡死。它还可以让用户有机会中止该操作。
进度对话框的一个常见问题是难以确定何时使用它们;因为在不同的硬件上,操作所需的时间各不相同。 QProgressDialog 为这个问题提供了一个解决方案:它会根据各步骤所需的时间来估算操作的总耗时,并且只有当该估计时间超过minimumDuration()(默认值为 4 秒)时,才会显示进度对话框。
使用setMinimum()和setMaximum()或构造函数来设置操作中的“步骤”数,并在操作进行过程中调用setValue()。步骤数可以任意选择。它可以是复制的文件数、接收的字节数、算法主循环的迭代次数,或其他合适的单位。 进度从setMinimum()设定的值开始计算,当您调用setValue()并将其参数设为setMaximum()设定的值时,进度对话框会显示操作已完成。
操作结束时,对话框会自动重置并隐藏。若要更改此行为,请使用setAutoReset()和setAutoClose()。请注意,如果设置的新最大值(通过setMaximum()或setRange())等于当前的value(),则对话框无论如何都不会关闭。
使用 QProgressDialog 有两种方式:模态和非模态。
与非模态 QProgressDialog 相比,模态 QProgressDialog 对程序员来说更简单易用。在循环中执行操作,间隔性调用setValue(),并使用wasCanceled() 检查是否被取消。例如:
QProgressDialog progress("Copying files...", "Abort Copy", 0, numFiles, this);
progress.setWindowModality(Qt::WindowModal);
for (int i = 0; i < numFiles; i++) {
progress.setValue(i);
if (progress.wasCanceled())
break;
//... copy one file
}
progress.setValue(numFiles);非模态进度对话框适用于在后台进行的操作,此时用户仍可与应用程序进行交互。此类操作通常基于定时器类,例如QChronoTimer (或更底层的QObject::timerEvent())或QSocketNotifier ;或者在单独的线程中执行。 在主窗口的状态栏中显示一个QProgressBar ,通常可以作为无模式进度对话框的替代方案。
你需要确保有一个事件循环正在运行,将canceled()信号连接到一个用于停止操作的槽函数上,并间隔性地调用setValue()。例如:
// Operation constructor
Operation::Operation(QObject *parent)
: QObject(parent), steps(0)
{
pd = new QProgressDialog("Operation in progress.", "Cancel", 0, 100);
connect(pd, &QProgressDialog::canceled, this, &Operation::cancel);
t = new QTimer(this);
connect(t, &QTimer::timeout, this, &Operation::perform);
t->start(0);
}
void Operation::perform()
{
pd->setValue(steps);
//... perform one percent of the operation
steps++;
if (steps > pd->maximum())
t->stop();
}
void Operation::cancel()
{
t->stop();
//... cleanup
}在两种模式下,均可通过调用setLabel()、setBar() 和setCancelButton() 将子控件替换为自定义控件,从而自定义进度对话框。函数setLabelText() 和setCancelButtonText() 用于设置显示的文本。

另请参阅 QDialog 和QProgressBar 。
属性文档
autoClose : bool
该属性用于控制对话框是否会被reset() 隐藏
默认值为 true。
访问函数:
| bool | autoClose() const |
| void | setAutoClose(bool close) |
另请参阅 setAutoReset()。
autoReset : bool
该属性用于确定当value()的值等于maximum()时,进度对话框是否会立即调用reset()。
默认值为 true。
访问函数:
| bool | autoReset() const |
| void | setAutoReset(bool reset) |
另请参阅 setAutoClose()。
labelText : QString
该属性用于存储标签的文本
默认文本为空字符串。
访问函数:
| QString | labelText() const |
| void | setLabelText(const QString &text) |
maximum : int
该属性存储进度条所表示的最高值
默认值为 100。
访问函数:
| int | maximum() const |
| void | setMaximum(int maximum) |
minimum : int
该属性存储进度条所表示的最小值
默认值为 0。
访问函数:
| int | minimum() const |
| void | setMinimum(int minimum) |
minimumDuration : int
该属性指定对话框出现前必须经过的时间
如果任务的预计持续时间小于 minimumDuration,则对话框将不会显示。这可以防止对话框在任务很快完成时弹出。对于预计持续时间超过 minimumDuration 的任务,对话框将在 minimumDuration 时间过后弹出,或者在设置任何进度后立即弹出。
如果设置为 0,则只要设置了任何进度,对话框就会立即显示。默认值为 4000 毫秒。
访问函数:
| int | minimumDuration() const |
| void | setMinimumDuration(int ms) |
value : int
该属性存储当前的进度值。
为了使进度对话框按预期工作,您应首先将此属性设置为QProgressDialog::minimum(),最后将其设置为QProgressDialog::maximum();在此期间,您可以任意多次调用 setValue()。
警告:如果 进度对话框是模态的(参见QProgressDialog::QProgressDialog()),setValue() 会调用QCoreApplication::processEvents();因此请注意,这可能会在您的代码中引发不希望出现的再入问题。例如,请勿在paintEvent() 内部使用QProgressDialog !
访问函数:
| int | value() const |
| void | setValue(int progress) |
[read-only] wasCanceled : bool
该属性用于指示对话框是否已被取消
访问函数:
| bool | wasCanceled() const |
成员函数文档
[explicit] QProgressDialog::QProgressDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
创建一个进度对话框。
默认设置:
- 标签文本为空。
- “取消”按钮的文本为(已翻译的)“取消”。
- 最小值为 0;
- 最大值为 100
parent 参数是对话框的父控件。控件标志f 将传递给QDialog::QDialog()构造函数。
另请参阅 setLabelText()、setCancelButtonText()、setCancelButton()、setMinimum() 以及setMaximum()。
QProgressDialog::QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
创建一个进度对话框。
labelText 表示用于提醒用户当前正在进行什么操作的文本。
cancelButtonText 是“取消”按钮上显示的文本。如果传入的是 QString(),则不显示“取消”按钮。
minimum 和maximum 分别表示该进度对话框所显示的操作步骤数量。例如,若操作需检查50个文件,则该值的最小值为0,最大值为50。在检查第一个文件之前,请调用setValue(0)。 随着每个文件的处理,依次调用setValue(0)、setValue(2) 等,最后在检查完最后一个文件后调用setValue(50)。
参数 `parent ` 是对话框的父控件。父控件、parent 以及控件标志 `f` 将作为参数传递给 `QDialog::QDialog()` 构造函数。
另请参阅 setLabelText()、setLabel()、setCancelButtonText()、setCancelButton()、setMinimum() 以及setMaximum()。
[virtual noexcept] QProgressDialog::~QProgressDialog()
关闭进度对话框。
[slot] void QProgressDialog::cancel()
重置进度对话框。wasCanceled() 将返回 true,直到进度对话框被重置为止。进度对话框将被隐藏。
[signal] void QProgressDialog::canceled()
点击“取消”按钮时会发出此信号。默认情况下,该信号连接到cancel()槽。
另请参阅 wasCanceled()。
[override virtual protected] void QProgressDialog::changeEvent(QEvent *ev)
重写了:QWidget::changeEvent(QEvent *event)。
[override virtual protected] void QProgressDialog::closeEvent(QCloseEvent *e)
重写了:QDialog::closeEvent(QCloseEvent *e)。
[protected slot] void QProgressDialog::forceShow()
如果在算法启动后,且经过minimumDuration 毫秒,对话框仍处于隐藏状态,则显示该对话框。
另请参阅 setMinimumDuration()。
void QProgressDialog::open(QObject *receiver, const char *member)
打开对话框,并将该对话框的canceled()信号连接到由receiver 和member 指定的槽。
当对话框关闭时,该信号将与该槽断开连接。
[slot] void QProgressDialog::reset()
重置进度对话框。如果autoClose() 的返回值为 true,则进度对话框将被隐藏。
另请参阅 setAutoClose() 和setAutoReset()。
[override virtual protected] void QProgressDialog::resizeEvent(QResizeEvent *event)
重写了:QDialog::resizeEvent (QResizeEvent *)。
void QProgressDialog::setBar(QProgressBar *bar)
将进度条控件设置为bar 。进度对话框会自动调整大小以适应该控件。进度对话框会接管进度bar 的拥有权,该对象将在必要时被删除,因此请勿使用在栈上分配的进度条。
void QProgressDialog::setCancelButton(QPushButton *cancelButton)
将“取消”按钮设置为按压式按钮,cancelButton 。进度对话框会接管此按钮的所有权,并在必要时将其删除,因此请勿传递位于栈上的对象地址,即应使用 new() 创建该按钮。如果传递nullptr ,则不会显示“取消”按钮。
另请参阅 setCancelButtonText()。
[slot] void QProgressDialog::setCancelButtonText(const QString &cancelButtonText)
将“取消”按钮的文本设置为cancelButtonText 。如果文本设置为QString(),则会导致“取消”按钮被隐藏并删除。
另请参阅 setCancelButton()。
void QProgressDialog::setLabel(QLabel *label)
将标签设置为label 。进度对话框会自动调整大小以适应内容。该标签将由进度对话框管理,并在必要时被删除,因此请勿传递栈上对象的地址。
另请参阅 setLabelText()。
[slot] void QProgressDialog::setRange(int minimum, int maximum)
将进度对话框的最小值和最大值分别设置为minimum 和maximum 。
如果maximum 小于minimum ,则minimum 将成为唯一有效的值。
如果当前值超出新范围,则通过reset() 重置进度对话框。
[override virtual protected] void QProgressDialog::showEvent(QShowEvent *e)
重写了:QDialog::showEvent(QShowEvent *event)。
[override virtual] QSize QProgressDialog::sizeHint() const
重写:QDialog::sizeHint() const。
返回一个能容纳进度对话框内容的大小。进度对话框会根据需要自动调整大小,因此您通常无需手动调用此函数。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.