QProgressDialog Class
QProgressDialog 类可提供有关慢速操作进度的反馈。更多
Header: | #include <QProgressDialog> |
CMake.QProgressDialog | 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() 设置的值开始,以setMaximum() 设置的值作为参数调用setValue() 时,进度对话框会显示操作已完成。
操作结束时,对话框会自动重置和隐藏。使用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,则根本不会出现对话框。这可以防止对话框在任务很快结束时弹出。对于预计超过最短持续时间的任务,对话框将在最短持续时间结束后或设置任何进度后立即弹出。
如果设置为 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 : const 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(1)、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() 常量。
返回适合进度对话框内容的大小。进度对话框会根据需要自行调整大小,因此您无需自行调用。
© 2025 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.