QMessageBox類:
含有Question消息框、Information消息框、Warning消息框和Critical消息框等
通常有兩種方式可以來創建標准消息對話框:
一種是采用“基於屬性”的API,一種是使用QMessageBox的靜態方法。
后者書寫容易,但缺少靈活性,針對用戶給出的提示的信息不夠豐富,並且不能自定義消息對話框里面的按鈕提示信息。因此推薦第一種寫法。
- <span style="font-size:18px;">#include <QMessageBox>
- void MessageShow()
- {
- QMessageBox::StandardButton reply; // 枚舉型變量
- reply = QMessageBox::critical(this,tr("QMessageBox::cirtical()"), //有critical question information warning類型的消息對話框
- MESSAGE,QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore);
- // 此類按鈕還有如 OK HELP Yes No等等
- if(reply == QMessageBox::Abort)
- {
- criticalLabel->setText(tr("Abort"));
- }
- else if(reply == QMessageBox::Retry)
- {
- criticalLabel->setText(tr("Retry"));
- }
- else
- {
- criticalLabel->setText(tr("Ignore"));
- }
- } </span>
這個例子是使用AMessageBox類的靜態方法,后面的例子中就是采用“基於屬性”的API方法。
QFileDialog類:
QFileDialog類提供了允許用戶選擇文件或者目錄的對話框。
QFileDialog類允許用戶在它們的文件系統上遍歷來選擇一個或多個文件或目錄。
最簡單的方式是使用靜態函數來創建一個QFileDialog。在Windows上,這些靜態函數將調用本地Windows文件對話框並且在Mac OS X上,這些靜態函數將調用本地Mac OS X文件對話框。
- <span style="font-size:18px;"> QString s = QFileDialog::getOpenFileName(
- "/home",
- "Images (*.png *.xpm *.jpg)",
- this,
- "open file dialog"
- "Choose a file" );</span>
在上面的實例中,一個模式對話框被使用靜態函數來創建。開始目錄被設置為“/home”。文件過濾器被設置為“Images (*.png *.xpm *.jpg)”。文件對話框的父對象被設置為this並且它被給定一個標識名稱——“open file dialog”。文件對話框上面的標題被設置為“Choose a file”。
QFontDialog類:
標准字體對話框,一種是使用QFontDialog類的構造函數,一種是使用QFrontDialog類的靜態使用方法getFont()
實例:
- <span style="font-size:18px;"> bool ok;
- QFont font = QFontDialog::getFont(
- &ok, QFont( "Helvetica [Cronyx]", 10 ), this );
- if ( ok ) {
- // font被設置為用戶選擇的字體
- } else {
- // 用戶取消這個對話框,font被設置為初始值,在這里就是Helvetica [Cronyx], 10
- }</span>
對話框也可以被用來直接設置窗口部件的字體:
myWidget.setFont( QFontDialog::getFont( 0, myWidget.font() ) );
如果用戶點擊OK,它們選擇的字體將被myWidget使用,並且如果點擊Cancel,最初的字體被使用。
也可以參考QFont、QFontInfo、QFontMetrics和對話框類。
QPageSetupDialog類:
不是很主流的類,配置與頁相關的打印機選項
QProgressDialog類:
QProgressDialog類提供了慢操作的進度的反饋。
進度對話框用於給用戶這個操作還要有多長時間的指示,並且證明這個應用程序還沒有凍結。它也給用於一個中止這個操作運行的機會。
這里有使用QProgressDialog的兩種方法:模式和非模式。
對於程序員,使用模式QProgressDialog是更簡單的,但是你必須調用qApp->processEvents()來保持事件循環的運行來確保應用程序沒有凍結。在循環中執行這個操作,在間隔中調用setProgress(),並且檢查wasCancelled()的取消。例如:
- QProgressDialog progress( "Copying files...", "Abort Copy", numFiles,
- this, "progress", TRUE );
- for ( int i = 0; i < numFiles; i++ ) {
- progress.setProgress( i );
- qApp->processEvents();
- if ( progress.wasCancelled() )
- break;
- //……復制文件
- }
- progress.setProgress( numFiles );
非模式進度對話框適合發生在后台的操作,用戶還可以和應用程序進行交互。這樣的操作通常是基於QTimer(或者QObject::timerEvent())、QSocketNotifier或QUrlOperator,或者在一個獨立的進度中執行。你的主窗口的狀態條中的QProgressBar常常可以做為模式進度對話框的替代。
你需要擁有一個正在運行的時間循環,把cancelled()信號和停止這個操作的槽連接起來,並且在間隔中調用setProgress()。例如:
- Operation::Operation( QObject *parent = 0 )
- : QObject( parent ), steps( 0 )
- {
- pd = new QProgressDialog( "Operation in progress.", "Cancel", 100 );
- connect( pd, SIGNAL(cancelled()), this, SLOT(cancel()) );
- t = new QTimer( this );
- connect( t, SIGNAL(timeout()), this, SLOT(perform()) );
- t->start( 0 );
- }
- void Operation::perform()
- {
- pd->setProgress( steps );
- //……執行操作的一個半分比
- steps++;
- if ( steps > pd->totalSteps() )
- t->stop();
- }
- void Operation::cancel()
- {
- t->stop();
- //……清除
你可以通過使用setLabel()、setBar()和setCancelButton()用自定制的窗口部件來替換子窗口部件來定制這兩種進度對話框。

也可以參考QDialog、QProgressBar、圖形用戶界面設計手冊:進度指示器和Dialog Classes。
下面是例子的源代碼
qbuiltingdlg.h
- #ifndef QBUILTINDLG_H
- #define QBUILTINDLG_H
- #include <QMainWindow>
- #include <QApplication>
- #include <QPushButton>
- #include <QDialog>
- #include <QGridLayout>
- #include <QWidget>
- #include <QHBoxLayout>
- #include <QLabel>
- #include <QTextEdit>
- #include <QLineEdit>
- #include <QComboBox>
- #include <QDialogButtonBox>
- #include <QGridLayout>
- #include <QDialog>
- #include <QtGui>
- namespace Ui {
- class QBuiltinDlg;
- }
- class QTextEdit;
- class QPushButton;
- class QBuiltinDlg : public QDialog
- {
- Q_OBJECT
- public:
- explicit QBuiltinDlg(QWidget* parent = 0);
- virtual ~QBuiltinDlg();
- private:
- QTextEdit* displayTextEdit;
- QPushButton* colorPushBtn;
- QPushButton* errorPushBtn;
- QPushButton* filePushBtn;
- QPushButton* fontPushBtn;
- QPushButton* inputPushBtn;
- QPushButton* pagePushBtn;
- QPushButton* progressPushBtn;
- QPushButton* printPushBtn;
- private slots:
- void doPushBtn();
- private:
- Ui::QBuiltinDlg *ui;
- };
- #endif // QBUILTINDLG_H
qbuiltindlg.cpp
中間有很多注釋用於解釋,詳細的內容可以看文檔
- #include "qbuiltindlg.h"
- #include "ui_qbuiltindlg.h"
- QBuiltinDlg::QBuiltinDlg(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::QBuiltinDlg)
- {
- displayTextEdit = new QTextEdit(tr("The standard text edit of QT"));
- QGridLayout* gridLayout = new QGridLayout;
- /*
- *創建一個網格布局管理器QGridLayout對象,gridLayout布局管理器將會管理和排布所有的窗口部件。
- *接下來,創建7個QPushButton對象,這些對象分別用來控制顏色對話框、錯誤消息框、文件對話框、字體對話框、輸入對話 框、頁設置對話框、進度對話框和打印對話框的創建和顯示。
- *然后調用QGridLayout::addWidget()函數,將所有的QPushButton以及QTextEdit窗口部件排布在網格布局管理器gridLayout中。
- *最后,函數QDialog::setLayout()將網格布局管理器gridLayout設置為內建對話框CBuiltinDlg對象的頂層布局管理器。
- */
- colorPushBtn = new QPushButton(tr("Color Dialog"));
- errorPushBtn = new QPushButton(tr("Error Message"));
- filePushBtn = new QPushButton(tr("File Dialog"));
- fontPushBtn = new QPushButton(tr("Front Dialog"));
- inputPushBtn = new QPushButton(tr("Input Dialog"));
- pagePushBtn = new QPushButton(tr("PageSet Dialog"));
- progressPushBtn = new QPushButton(tr("Process Dialog"));
- printPushBtn = new QPushButton(tr("Printer Dialog"));
- gridLayout->addWidget(colorPushBtn, 0, 0, 1, 1);
- gridLayout->addWidget(errorPushBtn, 0, 1, 1, 1);
- gridLayout->addWidget(filePushBtn, 0, 2, 1, 1);
- gridLayout->addWidget(fontPushBtn, 1, 0, 1, 1);
- gridLayout->addWidget(inputPushBtn, 1, 1, 1, 1);
- gridLayout->addWidget(pagePushBtn, 1, 2, 1, 1);
- gridLayout->addWidget(progressPushBtn, 2, 0, 1, 1);
- gridLayout->addWidget(printPushBtn, 2, 1, 1, 1);
- gridLayout->addWidget(displayTextEdit, 3, 0, 3, 3);
- /*
- *將所有的QPushButton對象的clicked()信號關聯到內建對話框類CBuiltinDlg的槽函數doPushButton(),
- *即所有QPushButton對象的 單擊操作都由統一的槽函數doPushButton()來處理。
- */
- connect(colorPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(errorPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(filePushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(fontPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(inputPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(pagePushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(progressPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(printPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- setWindowTitle(tr("Builtin"));
- resize(400, 300);
- setLayout(gridLayout);
- }
- QBuiltinDlg::~QBuiltinDlg()
- {
- delete ui;
- }
- void QBuiltinDlg::doPushBtn()
- {
- /*
- *槽函數的開頭,首先是獲取發送信號的QPushButton對象的指針。函數QOjbect::sender()返回發送信號的對象的指針,返回類型 為QObject*。
- *模板函數 T qobject_cast(QObject* object)
- *完成類型的轉換,將<QOjbect*>類型的對象指針轉換為類型為<T *>的對象指針,如果轉換成功,返回正確的對象指針,否則 返回0。
- *類型T必須是直接或間接繼承自QOjbect的類,並且在該類的定義里有Q_OBJECT宏變量(否則qobject_cast()函數的返回值是未定義的)。
- *此外,可以認為一個類繼承自它自身。qobject_cast()模板函數的作用類似於標准C++的
- *dynamic_cast()模板函數,不過qobject_cast()不需要運行時類型信息(Run-Time Type Information, RTTI)的支持。
- */
- QPushButton* btn = qobject_cast<QPushButton*>(sender());
- /*
- *if()條件判斷語句,判斷發送信號的對象是否是相應的QPushButton對象(colorBtn、errorPushBtn等),如果是則創建 相應的Qt內建對話框並進行顯示;
- *否則將會跳過該段代碼,直到找到條件為true的if()條件語句。
- */
- if(btn == colorPushBtn)
- {// 顏色對話框.
- QPalette palette = displayTextEdit->palette();
- const QColor& color = QColorDialog::getColor(palette.color(QPalette::Base), this);
- if(color.isValid())
- {
- palette.setColor(QPalette::Base, color);
- displayTextEdit->setPalette(palette);
- }
- }
- /*
- *上面這段代碼是顏色對話框的例子,它的功能是利用Qt內建的顏色對話框QColorDialog類獲取用戶選擇的顏色,然后設置文本 編輯框的背景色。
- *函數QTextEdit::palette()獲取文本編輯框對象displayTextEdit的調色板。
- *接下來,調用 QColorDialog::getColor()函數創建並顯示一個模態的顏色對話框,並返回用戶選擇的顏色對象的常量引用(對時對象的引用是無效的,必須使用常量引用)賦給變量color;
- *如果用戶單擊“取消”按鈕,顏色對話框將返回一個無效的顏色;
- *顏色對話框的顏色初始化為palette.color (QPalette::Base),即文本編輯框的背景色;父窗口部件為this。
- *QColor::isValid() 函數判斷顏色對話框返回的顏色是否有效。如果顏色對話框返回的顏色是有效的,函數QPalette::setColor() 設 置調色板的背景顏色為顏色對話框返回的顏色。
- *此處的QPalette:: setColor() 函數具有2個參數,第1個參數QPalette::Base指定了調色板的角色,
- *告訴程序應該設置調色板的所有三個顏色組中的哪一個角色的顏色(該函數將會影響到所有的三個顏色組);
- *第2個參數 color 指定應該設置的顏色。最后,函數QtextEdit::setPalette()重新設置文本編輯框的調色板。
- */
- else if(btn == errorPushBtn)
- {// 錯誤消息框.
- QErrorMessage box(this);
- box.setWindowTitle(tr("Error Message"));
- box.showMessage(tr("Error 1"));
- box.showMessage(tr("Error 2"));
- box.showMessage(tr("Error 3"));
- box.showMessage(tr("Error 4"));
- box.showMessage(tr("Error 5"));
- box.exec();
- }
- /*
- *該段代碼是一個錯誤消息框的例子。在這個例子中,多次調用了QErrorMessage::showMessage()函數,該函數的功能是在錯誤消 息框中顯示錯誤信息。
- *多次調用該函數,是為了演示顯示不同錯誤信息、多個相同錯誤信息以及錯誤消息框的“再次顯示這個消息”復選框選中與否的效果。
- *最后,執行QErrorMessage::exec()顯示對話框。
- *此為“基於屬性的”API方法
- */
- else if(btn == filePushBtn)
- {// 文件對話框.
- QString fileName = QFileDialog::getOpenFileName(this,tr("open the file"),"/home/czm",
- tr("All files(*.*)"";;text files(*.txt)"";;XML files(*.xml)"));
- displayTextEdit->setText(fileName);
- }
- /*
- *該段代碼打開一個文件對話框,獲取用戶選擇的文件名並顯示在文本編輯框中。此處,函數QFileDialog::getOpenFileName()具有4個參數。
- *其中,實參 this 指定文件對話框的父窗口部件;實參 tr("打開文件") 指定文件對話框的標題;
- *實參“/home/czm”指 定了文件對話框的默認路徑;最后一個參數比較復雜,它指定了文件對話框的多個文件過濾器,過濾器之間通過兩個分 號“;;”間隔。
- *如果用戶選擇了文件,並單擊“確定”按鈕,那么該文件對話框將返回用戶選擇的文件名;而如果用戶單擊“取消”按 鈕,該對話框將返回一個NULL 字符串。
- */
- else if(btn == fontPushBtn)
- {// 字體對話框.
- bool ok;
- const QFont& font = QFontDialog::getFont(&ok, displayTextEdit->font(),this,tr("字體對話框"));
- if(ok)
- {// 如果<確定>,設置字體.
- displayTextEdit->setFont(font);
- }
- }
- /*
- *QFontDialog::getFont() 函數創建並顯示一個字體對話框。此處,該函數具有四個參數:
- *第1個參數是一個輸出參數,用於標識用 戶的選擇狀態,如果用戶單擊“確定”按鈕,該字體對話框將會設置ok變量為true;而如果用戶單擊“取消”按鈕,ok將會被設置 為false。
- *第2個參數指定了對話框的初始顏色,當用戶取消顏色的選擇時,字體對話框將初始顏色作為返回值。
- *this參數指定了父窗口部件,最后一個參數指定了字體對話框的標題。
- */
- else if(btn == inputPushBtn)
- {// 輸入對話框.
- bool ok;
- QString text = QInputDialog::getText(this,tr("InputDialog"),tr("Please Input text"),
- QLineEdit::Normal,QDir::home().dirName(),&ok);
- if(ok && !text.isEmpty())
- {
- displayTextEdit->setText(text);
- }
- }
- /*
- *QInputDialog::getText()函數創建並顯示一個文本輸入對話框。
- *前2個參數分別指定了輸入對話框的父窗口部件和對話框的標題;
- *第3個參數指定了標簽的顯示文本;
- *第4個參數指定了行編輯框QLineEdit輸入內容的顯示模式,此處 為QLineEdit::Normal,即按用戶輸入的實際內容顯示;
- *第5個參數指定了行編輯框默認顯示的內容,函數QDir::home() 返回用 戶的home路徑,QDir::dirName()返回路徑的名字;
- *最后一個參數和QFontDialog::getFont()函數的第1個參數的作用相同。
- */
- else if(btn == pagePushBtn)
- {// 頁設置對話框.
- QPrinter printer;
- QPageSetupDialog dlg(&printer, this);
- dlg.setWindowTitle(tr("PageSet Dialog"));
- if (dlg.exec() == QDialog::Accepted)
- {
- // 進行下一步的處理。
- }
- }
- /*
- *首先,定義了一個打印機QPrinter對象printer。
- *然后創建了一個頁設置對話框QPageSetupDialog對象,並設置對話框的標題。
- *在這個例子中,只是簡單地創建和顯示一個頁設置對話框,該對話框返回后沒有進行下一步的處理。
- */
- else if(btn == progressPushBtn)
- {// 進度對話框.
- QProgressDialog progress(tr("Coping..."), tr("Cancel"),0,10000,this);
- progress.setWindowModality(Qt::WindowModal);
- progress.setWindowTitle(tr("Process Dialog"));
- progress.show();
- for(int i=0; i<10000; i++)
- {
- progress.setValue(i);
- qApp->processEvents();
- if(progress.wasCanceled())
- break;
- //... 復制文件處理。
- qDebug() << i;
- }
- progress.setValue(10000);
- }
- /*
- *這一段代碼創建了一個進度對話框,並模擬了顯示一個長時間操作的工作進程。
- *首先,調用了QProgressDialog的構造函數,創建了一個進度對話框的棧對象。構造函數有5個參數。
- *第1個參數是一個字符串,它指定了顯示給用戶的提示信息,表明當前正在進行的工作:
- *第2個參數指定了“取消”按鈕的顯示文本,如果該參數為0的話,進度對話框將沒有“取消”按鈕,即創建進度對話框的代碼為QProgressDialog progress(tr("Coping..."), 0 , 0, 10000, this)
- *接下來的2個參數分別指定了操作的步數(在上面的例子中,可以假定進度對話框顯示復制10 000個文件的進展情況,
- *第3個參 數設定為0,第4個參數設定為10 000,即這兩個參數的差值決定了這個復制操作的步數為10 000)。
- *第5個參數指定了進度對話框的父窗口部件。
- *接下來,函數setWindowModality()設置進度對話框的類型為Qt::WindowModal,即為模態對話框。
- *有兩種方式使用進度對話框QProgressDialog:模態對話框方式。
- *使用一個模態進度對話框顯示長時間操作的工作進度對於編程是比較簡單的,
- *但是必須調用QApplication::processEvents()函數或者QEventLoop::processEvents(QEventLoop::ExcludeUserInputEvents)函數以保證事件循環還可以處理其他事件,
- *以防止應用程序因為長時間的操作而導致沒有反應。
- *在自定義對話框的例子中,使用了模態進度對話框,通過QProgressDialog::setValue()函數推進顯示的進度;
- *通過QProgressDialog::wasCancled()函數判斷用戶是否中途選擇 了“取消”按鈕,如果是,將中斷復制文件操作。
- *此外,代碼使用了qDebug()函數打印for()語句的運行進度,模擬復制操作。
- *非模態對話框方式。非模態進度對話框適用於顯示在后台運行的長時間操作的工作進度,這樣的話,用戶就能夠和應用程序 的其他窗口進行交互。
- */
- else if(btn == printPushBtn)
- {// 打印對話框.
- QPrinter printer;
- QPrintDialog dlg(&printer, this);
- dlg.setWindowTitle(tr("Printer Dialog"));
- if (dlg.exec() == QDialog::Accepted)
- {
- // 進行下一步的處理。
- }
- }
- }
main.cpp
- #include <QApplication>
- #include "qbuiltindlg.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- QBuiltinDlg w;
- w.show();
- return a.exec();
- }
補充閱讀:
關於Qt調色板類QPalette
QPalette類包含了Qt窗口部件的顏色組(color group):
— Active組,該組的顏色用於當前活躍的(active)窗口,即具有鍵盤或鼠標焦點的窗口;
— Inactive組,該組用於其他的窗口;
— Disabled組,該組用於狀態為不可用的(disabled)的子窗口部件(不包含窗口)。
所有Qt窗口部件都擁有一個調色板並使用它繪制自己。通常,活躍狀態的窗口的標題欄顯示為藍色的,而非活躍(inactive)狀 態的窗口的標題欄顯示為灰色的;活躍狀態的窗口和非活躍狀態的窗口都可以包含狀態為不可用的窗口部件,一個不可用的窗 口部件(包括該窗口部件包含的子窗口部件)顯示為灰色的,用戶是無法與它進行交互的。通過改變窗口部件的調色板的各個 組中的顏色,能夠改變窗口部件的顯示顏色,比如改變背景色、文本顏色等。
可以通過QWidget::palette()獲取一個窗口部件的調色板,然后通過QWidget::setPalette()函數為該窗口部件設置修改后的調色板。 或者通過QApplication::palette() 函數獲取應用程序的調色板,並通過QApplication::setPalette() 為該應用程序設置修改后的調色 板。修改一個窗口部件的調色板只會影響到該窗口部件以及子窗口部件(不包含子窗口);而改變一個應用程序的調色板將會 影響到該應用程序的所有窗口部件。當對一個窗口部件的調色板已經作了修改后,再對其父窗口部件調色板的修改不會影響到該窗口部件的調色板;同樣,對應用程序調色板的修改不會影響已經單獨做出了調色板修改的窗口部件。
調色板類QPallete提供了顏色角色(color roles)概念,是指當前GUI界面中顏色的職責,通過枚舉變量QPalette::ColorRole來定 義,比較常用的顏色角色有:
— QPalette::Window,通常指窗口部件的背景色;
— QPalette::WindowText,通常指窗口部件的前景色;
— QPalette::Base,指文本輸入窗口部件(比如QTextEdit、QLineEidt等)的背景色
— QPalette::Text,與QPalette::Base一塊使用,指文本輸入窗口部件的前景色;
— QPalette::Button,指按鈕窗口部件的背景色;
— QPalette::ButtonText,指按鈕窗口部件的前景色。
http://blog.csdn.net/u013007900/article/details/43226283
