QT6 源,七章对话框与多窗体(11) 进度对话框 QProgressDialog:属性,公共成员函数,槽函数,信号函数,与源代码带注释

(1) 本类的继承关系

在这里插入图片描述

++可见,进度对话框,也是 QDialog 的子类,在其上面又摆放了一些控件,构成了不同用途的对话框。咱们也可以自定义对话框。只是没有 QT 官方大师们做的好。 人家在定义这 6 个子对话框的时候,还加入了属性 property 、信号函数、槽函数、静态函数等,整的很复杂,很全面。由此, QT 官方提供了这 6 种通用对话框,以满足最高频率的使用需求。

在这里插入图片描述

(2)给出本类的测试举例

在这里插入图片描述

(3)

在这里插入图片描述

(4)

在这里插入图片描述

(5)

在这里插入图片描述

(6)

在这里插入图片描述

(7)本源代码定义于头文件 qprogressdialog . h

#ifndef QPROGRESSDIALOG_H
#define QPROGRESSDIALOG_H

#include <QtWidgets/qtwidgetsglobal.h>

#include <QtWidgets/qdialog.h>

QT_REQUIRE_CONFIG(progressdialog);

QT_BEGIN_NAMESPACE

class QPushButton;
class QLabel;
class QProgressBar;
class QTimer;
class QProgressDialogPrivate;

/*
The QProgressDialog class provides feedback on the progress of a slow operation.

Detailed Description:
进度对话框用于向用户显示某个操作将耗时多久,并表明应用程序并未冻结。
它还可以为用户提供中止操作的机会。

进度对话框的一个常见问题在于难以确定何时使用它们;不同硬件上操作所需的时间各不相同。
QProgressDialog提供了一种解决方案:它估计操作所需的时间(基于步骤所需时间),
并且仅在估计时间超过minimumDuration()(默认为4秒)时才显示自身。

使用`setMinimum()和`setMaximum方法或构造函数来设置操作中的“步骤数量,
并在操作进行过程中调用`setValue()、方法。
步骤数量可以任意选择,可以是复制的文件数量、接收的字节数、算法主循环中的迭代次数,或者其他合适的单位。
进度从`setinimum()、设定的值开始,
当您调用`setValue()、方法并将由setMaximum()、设定的值作为参数时,这进度对话框将显示操作已完成。

该对话框会在操作结束时自动重置并隐藏自身。使用`setAutoReset()、和`setAutoClose来改变这一行为。

请注意,如果您设置了新的最大值(使用setMaximum()或setRange()、),且该值等于当前值,
则对话框将无论如何都不会关闭。

使用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(或Q0bject:timerEvent())或QSocketNotifier;或者是在单独的线程中执行。

主窗口状态栏中的 QProgressBar往往是无模态进度对话框的替代方案。

你需要有一个事件循环在运行,将“取消cancel”信号连接到停止操作的槽函数,并定时调用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()、函数用于设置显示的文本。


*/

class Q_WIDGETS_EXPORT QProgressDialog : public QDialog
{
    Q_OBJECT

    Q_DECLARE_PRIVATE(QProgressDialog)

    Q_PROPERTY(QString   labelText   //此属性持有标签的文本。默认文本为空字符串。
                READ     labelText   WRITE   setLabelText)

    /*
    此属性保存了当前完成的进度量。
    为使进度对话框按预期工作,您应先将此属性设置为、QProgressDialog::minimum(),
    最后再设置为 QProgressDialog::maximum()、;您可以在两者之间多次调用`setValue()、方法。
    警告:如果进度对话框是模态的(参见QProgressDialog::QProgressDialog()),
    则setValue()调用 QCoreApplication::processEvents(),
    因此请留意不要在你的代码中导致不期望的重入。
    例如,不要在paintEvent()内部使用 QProgressDialog。
    */
    Q_PROPERTY(int value   READ value   WRITE setValue  )

    //此属性表示进度条所代表的最低值。默认值为  0。
    Q_PROPERTY(int minimum READ minimum WRITE setMinimum)

    //此属性持有进度条 表示的最高值。 默认值为100。
    Q_PROPERTY(int maximum READ maximum WRITE setMaximum)

    //此属性表示对话框是否被取消
    Q_PROPERTY(bool wasCanceled READ  wasCanceled)

    //此属性表示当value()等于最大值时,进度对话框是否立即调用reset()。默认值为true。
    Q_PROPERTY(bool autoReset   READ  autoReset    WRITE  setAutoReset)

    //此属性表示对话框是否被 reset()隐藏。默认值为true。
    Q_PROPERTY(bool autoClose   READ  autoClose    WRITE  setAutoClose)

    Q_PROPERTY(int     minimumDuration
                READ   minimumDuration   WRITE   setMinimumDuration)
    /*
    此属性表示对话框出现前必须经过的时间。
    如果任务的预期持续时间短于“最小持续时间”,则对话框将完全不会显示。
    这可以避免在任务很快结束时就弹出对话框。
    对于预期持续时间将超过“最小持续时间”的任务,
        对话框将在“最小持续时间”时间过后或一旦设定任何进度时弹出。
    如果设置为0,一旦有任何进度就始终显示对话框。默认值是4000毫秒。
    */

protected:
    void   showEvent(QShowEvent   * event) override;
    void changeEvent(QEvent       * event) override;
    void resizeEvent(QResizeEvent * event) override;
    void  closeEvent(QCloseEvent  * event) override;

private:
    Q_DISABLE_COPY(QProgressDialog)

    Q_PRIVATE_SLOT(d_func(), void _q_disconnectOnClose())

public:
    //构建一个进度对话框。默认设置: 标签文本为空。取消按钮文本为“cancel”。最小值为 0,最大值为 100。
    //parent参数是对话框的父窗口。窗口标志 flags 被传递给QDialog::QDialog()构造函数。
    //QDialog(QWidget * parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
    explicit
    QProgressDialog(QWidget * parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());

    QProgressDialog(const   QString  &             labelText,
                    const   QString  &      cancelButtonText,
                            int             minimum         ,
                            int             maximum         ,
                            QWidget  *      parent = nullptr,
                            Qt::WindowFlags flags  = Qt::WindowFlags());
    //构建一个进度对话框。labelText是用于提醒用户正在进行什么的文本。
    //cancelButtonText是显示在取消按钮上的文本。如果传递了QString(),则不会显示取消按钮。
    //最小值 minimum和最大值 maximum是该进度对话框显示进度的操作中的步骤数。
    //例如,如果要检查50个文件,则该值的最小值为0,最大值为50。
    //在检查第一个文件之前,调用setValue(0)。
    //处理每个文件时,调用setValue(1)、setValue(2)等,最后在检查最后一个文件后调用 setValue(50)。
    //parent参数是对话框的父级窗口。parent和标志 flags,被传递给QDialog::QDialog() 构造函数。


    ~QProgressDialog();


//   Q_PROPERTY(QString     labelText      //此属性持有标签的文本。默认文本为空字符串。
//              READ        labelText      WRITE   setLabelText)
                QString     labelText() const;
public Q_SLOTS:
                void     setLabelText(const QString & text);

public :
//   Q_PROPERTY(int         value         此属性保存了当前完成的进度量。
//              READ        value         WRITE    setValue  )
                int         value() const;
public Q_SLOTS:
                void     setValue(int progress);

public :
//   Q_PROPERTY(int         minimum       //此属性表示进度条所代表的最低值。默认值为  0。
//              READ        minimum       WRITE    setMinimum)
                int         minimum() const;
public Q_SLOTS:
                void     setMinimum(int minimum);

                void     setRange  (int minimum, int maximum);

public :
//   Q_PROPERTY(int         maximum       //此属性持有进度条 表示的最高值。 默认值为100。
//              READ        maximum       WRITE   setMaximum)
                int         maximum() const;
public Q_SLOTS:
                void     setMaximum(int maximum);

public :
//   Q_PROPERTY(bool        wasCanceled   //此属性表示对话框是否被取消
//              READ        wasCanceled)
                bool        wasCanceled() const;

//   Q_PROPERTY(bool        autoReset     //当value()等于最大值时,是否调用reset()。默认为true。
//              READ        autoReset     WRITE  setAutoReset)
                bool        autoReset() const;
                void     setAutoReset(bool reset);


//   Q_PROPERTY(bool        autoClose     //调用 reset()时是否隐藏本对话框。默认值为true。
//              READ        autoClose     WRITE  setAutoClose)
                bool        autoClose() const;
                void     setAutoClose(bool close);


//   Q_PROPERTY(int         minimumDuration  //此属性表示对话框出现前必须经过的时间。
//              READ        minimumDuration   WRITE   setMinimumDuration)
                int         minimumDuration() const;
public Q_SLOTS:
                void     setMinimumDuration(int ms);


public :
    QSize sizeHint() const override;

    //将标签设置为label。进度对话框会进行相应调整以合适显示。
    //该标签将归属于进度对话框,并在必要时被删除,因此请勿传递栈上对象的地址。
    void setLabel       (QLabel       * label );
    void setBar         (QProgressBar * bar   ); //Sets the progress bar widget to bar.
    void setCancelButton(QPushButton  * button); //传递空指针将不再显示本取消按钮。
    //Sets the cancel button to the push button, cancelButton.
    //If nullptr is passed, no cancel button will be shown.

public Q_SLOTS:
    //void setMinimumDuration(int       ms        );
    //void setMaximum        (int       maximum   );
    //void setMinimum        (int       minimum   );
    //void setRange          (int       minimum, int maximum);
    //void setValue          (int       progress  );
    //void setLabelText(const QString & text      );

    void setCancelButtonText(const QString & text); //若形参为空字符串,则会删除本按钮
    //Sets the cancel button's text to cancelButtonText.
    //If the text is set to QString() then it will cause the
    //  cancel button to be hidden and deleted.

    //重置进度对话框。如果autoClose()为true,则进度对话框将被隐藏。
    void reset    ();

    void cancel   ();
    //重置进度对话框。wasCanceled()保持为真,直到进度对话框被重置 reset。进度对话框将被隐藏。

protected Q_SLOTS:
    //如果在算法启动后经过了minimumDuration毫秒,对话框仍然隐藏,则显示该对话框。
    void forceShow();

Q_SIGNALS:
    void canceled (); //经测试,程序员不做任何处理时,是无法通过点击取消按钮关闭本对话框的。
    //当点击取消按钮时,会触发此信号。默认情况下,它与cancel()插槽连接。需要手动来连接。

public:
    using QDialog::open; //将对话框显示为窗口模态 window modal dialog对话框,并立即返回。
    //virtual void QDialog::open();
    void open(QObject * receiver, const char * member);
    //显示对话框的同时,指定本类 canceled()信号的槽函数。
    //Opens the dialog and connects its canceled() signal to the
    //  slot specified by receiver and member.
    //The signal will be disconnected from the slot when the dialog is closed.

}; //完结 class QProgressDialog : public QDialog

QT_END_NAMESPACE

#endif // QPROGRESSDIALOG_H

(8)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值