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