QProgressDialog 显示任务的进度和状态

1.概要

//定周期更新进度

progressDialog.setValue(i * 100 / MaxNum);

2.内容

QProgressDialog是Qt框架中的一个类,主要用于显示任务的进度和状态,并向用户提供一个取消操作的选项。以下是对QProgressDialog的详细介绍:

基本属性

  • 标题:进度对话框的标题。
  • 标签文本:对话框中显示的文本信息,用于提示用户当前的操作或进度。
  • 取消按钮文本:取消按钮上显示的文本。
  • 进度条范围:通过setMinimum和setMaximum函数或构造函数设置进度条的最小值和最大值。
  • autoClose:表示当调用reset()函数时是否自动隐藏进度条,默认为false。
  • autoReset:表示当当前值value等于最大值maximum时是否自动调用reset(),默认为true。
  • minimumDuration:对话框出现之前必须经过的时间。如果任务的预期持续时间小于该值,则不会出现对话框。这可以防止为快速结束的任务弹出对话框。如果设置为0,则只要设置了任何进度,对话框就会立即显示。默认值为4000毫秒。

使用方法

创建一个QProgressDialog对象,通常通过构造函数指定标题、标签文本和进度条的范围等属性。然后,可以通过setModal()函数将其设置为模态对话框,这样在对话框显示期间,用户无法与其他窗口进行交互。在任务执行过程中,通过调用setValue()函数来更新进度条的当前值。如果用户点击了取消按钮,可以通过wasCanceled()函数来检查是否取消,并据此中断任务。

示例代码

以下是一个使用QProgressDialog的示例代码:

#include <QApplication>
#include <QProgressDialog>
#include <QThread>
#include <QTimer>
#include <QEventLoop>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QProgressDialog progressDialog("Loading...", "Cancel", 0, 100);
    progressDialog.setWindowTitle("Loading Progress");
    progressDialog.setAutoClose(false);
    progressDialog.setWindowModality(Qt::WindowModal);
    progressDialog.setMinimumDuration(0);

    QThread* thread = QThread::create([&]() {
        const int MaxNum = 100000;
        for (int i = 0; i < MaxNum; i++) {
            // 模拟一个耗时的计算任务
            QThread::msleep(10); // 休眠10毫秒

            // 更新进度条的当前值
            if (progressDialog.wasCanceled()) {
                break;
            }
            progressDialog.setValue(i * 100 / MaxNum);
        }

        // 任务完成后关闭进度条对话框
        progressDialog.close();
    });

    // 启动线程并显示进度条对话框
    thread->start();
    progressDialog.exec();

    return app.exec();
}

在这个示例中,首先创建了一个QProgressDialog对象,并设置了其属性。然后,启动了一个新线程来执行耗时的计算任务。在任务执行过程中,通过调用setValue()函数来更新进度条的当前值。如果用户点击了取消按钮,则通过wasCanceled()函数来检查是否取消,并据此中断任务。最后,当任务执行完毕后,关闭进度条对话框。

注意事项

  • 模态与非模态:QProgressDialog可以是模态的或非模态的。模态对话框会阻塞用户与其他窗口的交互,直到对话框被关闭。非模态对话框则允许用户同时与多个窗口进行交互。
  • 线程安全:如果在主线程中执行耗时操作并显示进度条对话框,可能会导致界面卡顿。因此,建议将耗时操作放在新线程中执行,并通过信号和槽机制来更新进度条。
  • 生命周期管理:QProgressDialog对象在使用完毕后应及时销毁,以避免内存泄漏。如果设置为模态对话框并使用exec()函数显示,则对话框关闭时会自动销毁。如果使用show()函数显示非模态对话框,则需要手动管理其生命周期。

总之,QProgressDialog是Qt框架中用于显示任务进度和状态的一个非常有用的类。通过合理使用QProgressDialog,可以提高应用程序的用户体验。

3.运行效果

4.关联链接

qt 进度条_qt qprogressbar-优快云博客

5.关联知识 

1.QProgressDialog构成

QProgressDialog是Qt框架中的一个类,用于显示任务进度和状态,并向用户提供一个取消操作的选项。 它是一个带有进度条和取消按钮的对话框,常用于需要较长时间完成的操作,如文件读写、网络请求等,以便向用户反馈操作进度并允许用户取消操作。

QProgressDialog的构成主要包括以下几个方面

  1. 基本属性设置

    • 标题:通过setWindowTitle(const QString &title)设置对话框的标题。
    • 标签文本:通过setLabelText(const QString &text)设置对话框中显示的文本信息,用于描述当前操作。
    • 取消按钮文本:通过setCancelButtonText(const QString &text)设置取消按钮上显示的文本。
  2. 进度条设置

    • 进度范围:通过setRange(int minimum, int maximum)设置进度条的最小值和最大值,表示操作的进度范围。
    • 当前进度值:通过setValue(int progress)设置进度条的当前值,表示操作已完成的进度。
  3. 对话框行为设置

    • 模态性:通过setWindowModality(Qt::WindowModality modality)设置对话框的模态性。模态对话框会阻塞用户与其他窗口的交互,直到对话框被关闭;非模态对话框则允许用户同时与多个窗口进行交互。
    • 自动关闭:通过setAutoClose(bool close)设置是否在当前值等于最大值时自动隐藏对话框。
    • 自动重置:通过setAutoReset(bool reset)设置是否在当前值等于最大值时调用reset()方法,将进度条重置为初始状态。
    • 最小显示时间:通过setMinimumDuration(int ms)设置对话框出现之前必须经过的时间。如果任务的预期持续时间小于该值,则不会显示对话框,以避免为快速结束的任务弹出对话框。
  4. 用户交互

    • 取消操作:用户可以通过点击取消按钮来终止操作。开发者可以通过wasCanceled()方法检查对话框是否被取消,并据此决定是否停止任务。
  5. 显示与关闭

    • 显示对话框:通过exec()show()方法显示对话框。exec()方法会阻塞当前线程,直到对话框被关闭;show()方法则不会阻塞线程。
    • 关闭对话框:当任务完成时,可以通过调用done()hide()方法关闭对话框。

示例代码

#include <QApplication>
#include <QProgressDialog>
#include <QTimer>
#include <QEventLoop>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QProgressDialog progress("Copying files...", "Abort Copy", 0, 100);
    progress.setWindowModality(Qt::WindowModal);
    progress.setMinimumDuration(0); // 立即显示对话框

    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, [&]() {
        static int value = 0;
        value++;
        progress.setValue(value);
        if (value >= progress.maximum() || progress.wasCanceled()) {
            timer.stop();
        }
    });
    timer.start(1000); // 每秒更新一次进度

    progress.exec(); // 显示对话框并进入事件循环
    qDebug() << "Operation finished or canceled.";

    return 0;
}

总结

QProgressDialog通过其丰富的属性和方法,为开发者提供了一个灵活、易用的进度条对话框解决方案。开发者可以根据具体需求设置对话框的标题、标签文本、进度条范围、模态性等属性,并通过更新进度条的值来向用户反馈操作进度。同时,QProgressDialog还支持用户取消操作,提升了应用程序的用户体验。

2.QProgressDialog常用接口 

QProgressDialog的常用接口主要包括以下几个方面:

一、构造函数

  • *QProgressDialog(QWidget parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())

    • 创建一个没有标签文本和取消按钮文本的进度对话框。
    • parent:父窗口控件,可以为nullptr
    • flags:窗口标志,用于设置窗口的特定行为,默认为Qt::WindowFlags()
  • *QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())

    • 创建一个带有标签文本和取消按钮文本的进度对话框。
    • labelText:进度对话框中显示的标签文本。
    • cancelButtonText:取消按钮上显示的文本。
    • minimum:进度条的最小值。
    • maximum:进度条的最大值。
    • parent:父窗口控件,可以为nullptr
    • flags:窗口标志,用于设置窗口的特定行为,默认为Qt::WindowFlags()

二、设置属性

  • void setWindowTitle(const QString &title)

    • 设置进度对话框的标题。
  • void setLabelText(const QString &text)

    • 设置进度对话框中标签的文本。
  • void setCancelButtonText(const QString &cancelButtonText)

    • 设置取消按钮上显示的文本。
  • void setRange(int minimum, int maximum)

    • 设置进度条的最小值和最大值。
  • void setValue(int progress)

    • 设置进度条的当前值。
  • void setWindowModality(Qt::WindowModality modality)

    • 设置对话框的模态性。
      • Qt::NonModal:非模态对话框,允许用户与其他窗口交互。
      • Qt::WindowModal:模态对话框,阻塞其他窗口的交互,直到对话框关闭。
      • Qt::ApplicationModal:应用程序模态对话框,阻塞整个应用程序的交互,直到对话框关闭。
  • void setAutoClose(bool close)

    • 设置是否在当前值等于最大值时自动隐藏对话框。
  • void setAutoReset(bool reset)

    • 设置是否在当前值等于最大值时调用reset()方法,将进度条重置为初始状态。
  • void setMinimumDuration(int ms)

    • 设置对话框出现之前必须经过的时间(以毫秒为单位)。

三、获取属性

  • QString labelText() const

    • 获取进度对话框中标签的文本。
  • int maximum() const

    • 获取进度条的最大值。
  • int minimum() const

    • 获取进度条的最小值。
  • int minimumDuration() const

    • 获取对话框出现之前必须经过的时间(以毫秒为单位)。
  • int value() const

    • 获取进度条的当前值。
  • bool wasCanceled() const

    • 检查对话框是否被取消。

四、控制对话框

  • **void open(QObject receiver, const char member)

    • 显示对话框,并将canceled()信号连接到指定的槽函数。
  • void exec()

    • 显示对话框,并进入事件循环,直到对话框被关闭。阻塞调用线程。
  • void show()

    • 显示对话框,但不进入事件循环。不阻塞调用线程。
  • void reset()

    • 重置进度对话框,将进度条的值设置为最小值,并隐藏对话框(如果设置了setAutoClose(true))。
  • void cancel()

    • 取消对话框,并调用reset()方法。

五、信号

  • void canceled()

    • 当用户点击取消按钮或调用cancel()方法时发射此信号。

六、示例

以下是一个简单的示例,展示了如何使用QProgressDialog来显示进度:

#include <QApplication>
#include <QProgressDialog>
#include <QTimer>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QProgressDialog progress("Copying files...", "Abort Copy", 0, 100);
    progress.setWindowModality(Qt::WindowModal);
    progress.setMinimumDuration(0); // 立即显示对话框

    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, [&]() {
        static int value = 0;
        value++;
        progress.setValue(value);
        if (value >= progress.maximum() || progress.wasCanceled()) {
            timer.stop();
        }
    });
    timer.start(1000); // 每秒更新一次进度

    progress.exec(); // 显示对话框并进入事件循环
    qDebug() << "Operation finished or canceled.";

    return 0;
}

在这个示例中,我们创建了一个QProgressDialog对象,并设置了标题、取消按钮文本、进度范围等属性。然后,我们使用一个QTimer来模拟进度更新,每秒增加一次进度值。当进度值达到最大值或用户点击取消按钮时,停止定时器并关闭对话框。

3.QProgressBar和QProgressDialog对比说明

下面是QProgressBar和QProgressDialog的对比表格:

QProgressBarQProgressDialog
功能用于在界面上显示一个进度条,描述任务的完成情况。提供一个带有进度条和取消按钮的对话框,用于显示耗时操作的进度,并允许用户取消操作。
外观横向或纵向的进度条控件。包括进度条、取消按钮和标签的对话框。
使用场景适用于需要在界面上长期显示任务进度的场景。适用于耗时操作,需要向用户指示操作进度,并允许用户取消操作。
主要接口setRange(int minimum, int maximum):设置进度条的范围。setRange(int minimum, int maximum):设置进度条的范围。
setValue(int value):设置进度条的当前值。setValue(int value):设置进度条的当前值。
setTextVisible(bool visible):设置进度条文本是否可见。setLabelText(const QString &text):设置对话框的标签文本。
setFormat(const QString &format):设置进度条文本的格式。setCancelButtonText(const QString &text):设置取消按钮的文本。
setMinimumDuration(int ms):设置对话框在显示之前必须经过的最短时间。
行为不会自动隐藏或重置。操作完成后,对话框会自动隐藏并重置。
可以通过setAutoReset()setAutoClose()改变自动隐藏和重置的行为。
模态性不具有模态性。可以选择模态或非模态显示。
交互性用户只能看到进度条,无法进行其他交互。用户可以看到进度条,并可以通过取消按钮中止操作。
示例用于文件下载、视频加载等进度显示。用于文件复制、数据导入等耗时操作的进度显示。

总结

  • QProgressBar:适合需要在界面上长期显示任务进度的场景,用户只能看到进度条,无法进行其他交互。
  • QProgressDialog:适合耗时操作,不仅显示进度条,还允许用户取消操作,并提供更友好的用户反馈。对话框会在操作结束时自动隐藏并重置。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值