(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)
谢谢