(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_NAMESPACEclass 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 operationsteps++;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_OBJECTQ_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 minimumDurationREAD 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());explicitQProgressDialog(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 QDialogQT_END_NAMESPACE#endif // QPROGRESSDIALOG_H
(8)
谢谢