QProgressDialog 类

QProgressDialog类提供了对慢速操作进度的反馈。更多信息...

头文件 #include <QProgressDialog>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承 QDialog

属性

公共函数

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()
boolautoClose() const
boolautoReset() const
QStringlabelText() const
intmaximum() const
intminimum() const
intminimumDuration() const
voidopen(QObject *receiver, const char *member)
voidsetAutoClose(bool close)
voidsetAutoReset(bool reset)
voidsetBar(QProgressBar *bar)
voidsetCancelButton(QPushButton *cancelButton)
voidsetLabel(QLabel *label)
intvalue() const
boolwasCanceled() const

重新实现公共函数

virtual QSizesizeHint() const override

公共槽

voidcancel()
voidreset()
voidsetCancelButtonText(const QString &cancelButtonText)
voidsetLabelText(const QString &text)
voidsetMaximum(int maximum)
voidsetMinimum(int minimum)
voidsetMinimumDuration(int ms)
voidsetRange(int minimum, int maximum)
voidsetValue(int progress)

信号

void已取消()

重写的保护函数

virtual voidchangeEvent(QEvent *ev) override
virtual voidcloseEvent(QCloseEvent *e) override
virtual voidresizeEvent(QResizeEvent *event) override
virtual voidshowEvent(QShowEvent *e) override

保护槽

voidforceShow()

详细说明

进度对话框用于提示用户操作将花费多少时间,以及演示应用程序没有冻结。它还可以给用户一个中断操作的机会。

进度对话框的一个常见问题是很难知道何时使用它们;操作在不同的硬件上花费的时间不同。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);

非模态进度对话框适合在后台进行的操作,其中用户能够与应用程序进行交互。此类操作通常基于 QTimer(或 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() 设置显示的文本。

A progress dialog shown in the Fusion widget style.

另请参阅 QDialogQProgressBar

属性文档

autoClose : bool

此属性表示对话框是否通过 reset() 隐藏

默认值为 true。

访问函数

boolautoClose() const
voidsetAutoClose(bool close)

另请参阅 setAutoReset

autoReset : bool

此属性表示当 value() 等于 maximum() 时,进度对话框是否立即调用 reset()。

默认值为 true。

访问函数

boolautoReset() const
voidsetAutoReset(bool reset)

另请参阅 setAutoClose

labelText : QString

此属性表示标签的文本

默认文本为空字符串。

访问函数

QStringlabelText() const
voidsetLabelText(const QString &text)

maximum : int

此属性表示进度条表示的最高值

默认值为 100。

访问函数

intmaximum() const
voidsetMaximum(int maximum)

另请参阅 minimumsetRange

minimum : int

此属性表示进度条表示的最低值

默认值为 0。

访问函数

intminimum() const
voidsetMinimum(int minimum)

另请参阅 maximumsetRange

minimumDuration : int

此属性表示对话框出现前必须经过的时间

如果任务的预期持续时间小于 minimumDuration,则对话框根本不会出现。这可以防止对话框弹出来完成快速任务。对于预期将超过 minimumDuration 的任务,对话框将在 minimumDuration 时间后弹出,或在任何进度设置后立即弹出。

如果设置为 0,则只要设置任何进度,对话框就始终显示。默认值为 4000 毫秒。

访问函数

intminimumDuration() const
voidsetMinimumDuration(int ms)

value : int

此属性表示当前完成的进度量。

为了确保进度对话框按预期工作,您应最初将其属性设置为QProgressDialog::minimum(),最后设置为QProgressDialog::maximum();您可以在其间任意次数调用setValue()。

注意:如果进度对话框是模态的(参见QProgressDialog::QProgressDialog()), setValue()会调用QCoreApplication::processEvents(),因此在您的代码中注意避免不希望的重入。例如,不要在paintEvent()中使用QProgressDialog!

访问函数

intvalue() const
voidsetValue(int progress)

另请参阅:minimummaximum

[只读] wasCanceled : const bool

此属性表示对话框是否被取消

访问函数

boolwasCanceled() const

成员函数说明

[显式] QProgressDialog::QProgressDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

构建进度对话框。

默认设置

  • 标签文本为空。
  • 取消按钮文本为(已翻译)"取消"。
  • 最小值为0;
  • 最大值为100

参数parent是对话框的父级小部件。小部件标志f传递给QDialog::QDialog()构造函数。

另请参阅:setLabelTextsetCancelButtonTextsetCancelButtonsetMinimumsetMaximum

QProgressDialog::QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

构建进度对话框。

参数labelText是用于提醒用户正在执行什么的文本。

参数cancelButtonText是取消按钮上显示的文本。如果传递QString(),则不显示取消按钮。

参数minimummaximum是此进度对话框显示进度的操作步骤总数。例如,如果操作是检查50个文件,则这个值的最小值将是0,最大值将是50。在检查第一个文件之前,调用setValue(0)。处理每个文件时,调用setValue(1)、setValue(2)等,最后检查最后一个文件后调用setValue(50)。

参数parent是对话框的父级小部件。父级parent和小部件标志f传递给QDialog::QDialog()构造函数。

另请参阅:setLabelTextsetLabelsetCancelButtonTextsetCancelButtonsetMinimumsetMaximum

[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() 信号连接到由 receivermember 指定的槽。

当对话框关闭时,将取消信号从槽断开连接。

[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)

将进度对话框的最小值和最大值分别设置为 minimummaximum

如果 maximum 小于 minimum,则 minimum 成为唯一的合法值。

如果当前值超出新范围,则使用 reset 将进度对话框重置。

另请参阅:minimummaximum

[override virtual protected] void QProgressDialog::showEvent(QShowEvent *e)

重新实现: QDialog::showEvent(QShowEvent *event)。

[override virtual] QSize QProgressDialog::sizeHint() const

重新实现: QDialog::sizeHint() const

返回一个适合进度对话框内容的大小。进度对话框需要时将自动调整大小,因此您通常不需要调用此方法。

© 2024 The Qt Company Ltd. 本文档的内容贡献者是各自版权的所有者。提供的文档符合 Free Software Foundation 发布的 GNU Free Documentation License 版本 1.3 条款。Qt 和相关标志是 The Qt Company Ltd 在芬兰和其他国家/地区的商标。所有其他商标均为各自所有者的财产。