#(15):標準對話框 QMessageBox
所謂標準對話框,是 Qt 內置的一系列對話框,用于簡化開發。事實上,有很多對話框都是通用的,比如打開文件、設置顏色、打印設置等。這些對話框在所有程序中幾乎相同,因此沒有必要在每一個程序中都自己實現這么一個對話框。
Qt 的內置對話框大致分為以下幾類:
* `QColorDialog`:選擇顏色;
* `QFileDialog`:選擇文件或者目錄;
* `QFontDialog`:選擇字體;
* `QInputDialog`:允許用戶輸入一個值,并將其值返回;
* `QMessageBox`:模態對話框,用于顯示信息、詢問問題等;
* `QPageSetupDialog`:為打印機提供紙張相關的選項;
* `QPrintDialog`:打印機配置;
* `QPrintPreviewDialog`:打印預覽;
* `QProgressDialog`:顯示操作過程。
這里我們簡單地介紹一下標準對話框`QMessageBox`的使用。在前面有了關于對話框的基礎之上,應該可以結合文檔很輕松地學習如何使用 Qt 的標準對話框。其它種類的標準對話框,我們將在后面的章節中再一一介紹。
`QMessageBox`用于顯示消息提示。我們一般會使用其提供的幾個 static 函數:
* `void about(QWidget * parent, const QString & title, const QString & text)`:顯示關于對話框。這是一個最簡單的對話框,其標題是 title,內容是 text,父窗口是 parent。對話框只有一個 OK 按鈕。
* `void aboutQt(QWidget * parent, const QString & title = QString())`:顯示關于 Qt 對話框。該對話框用于顯示有關 Qt 的信息。
* `StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)`:顯示嚴重錯誤對話框。這個對話框將顯示一個紅色的錯誤符號。我們可以通過 buttons 參數指明其顯示的按鈕。默認情況下只有一個 Ok 按鈕,我們可以使用`StandardButtons`類型指定多種按鈕。
* `StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)`:`QMessageBox::information()`函數與`QMessageBox::critical()`類似,不同之處在于這個對話框提供一個普通信息圖標。
* `StandardButton question(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)`:`QMessageBox::question()`函數與`QMessageBox::critical()`類似,不同之處在于這個對話框提供一個問號圖標,并且其顯示的按鈕是“是”和“否”兩個。
* `StandardButton warning(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)`:`QMessageBox::warning()`函數與`QMessageBox::critical()`類似,不同之處在于這個對話框提供一個黃色嘆號圖標。
我們可以通過下面的代碼來演示下如何使用`QMessageBox`。
~~~
if (QMessageBox::Yes == QMessageBox::question(this,
tr("Question"),
tr("Are you OK?"),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::Yes)) {
QMessageBox::information(this, tr("Hmmm..."), tr("I'm glad to hear that!"));
} else {
QMessageBox::information(this, tr("Hmmm..."), tr("I'm sorry!"));
}
~~~
我們使用`QMessageBox::question()`來詢問一個問題。這個對話框的父窗口是 this,也就是我們的 MainWindow(或者其他 QWidget 指針)。`QMessageBox`是`QDialog`的子類,這意味著它的初始顯示位置將會是在 parent 窗口的中央(我們在前面的章節中提到過這一點)。第二個參數是對話框的標題。第三個參數是我們想要顯示的內容。這里就是我們需要詢問的文字。下面,我們使用或運算符(|)指定對話框應該出現的按鈕。這里我們希望是一個 Yes 和一個 No。最后一個參數指定默認選擇的按鈕。這個函數有一個返回值,用于確定用戶點擊的是哪一個按鈕。按照我們的寫法,應該很容易的看出,這是一個模態對話框,因此我們可以直接獲取其返回值。如果返回值是 Yes,也就是說用戶點擊了 Yes 按鈕,我們顯示一個普通消息對話框,顯示“I’m glad to hear that!”,否則則顯示“I’m sorry!”。運行一下我們的程序片段,就可以看到其中的不同:
[](http://files.devbean.net/images/2012/09/qmessagebox-demo.png)
`QMessageBox`類的 static 函數優點是方便使用,缺點也很明顯:非常不靈活。我們只能使用簡單的幾種形式。為了能夠定制`QMessageBox`細節,我們必須使用`QMessageBox`的屬性設置 API。如果我們希望制作一個詢問是否保存的對話框,我們可以使用如下的代碼:
~~~
QMessageBox msgBox;
msgBox.setText(tr("The document has been modified."));
msgBox.setInformativeText(tr("Do you want to save your changes?"));
msgBox.setDetailedText(tr("Differences here..."));
msgBox.setStandardButtons(QMessageBox::Save
| QMessageBox::Discard
| QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save:
qDebug() << "Save document!";
break;
case QMessageBox::Discard:
qDebug() << "Discard changes!";
break;
case QMessageBox::Cancel:
qDebug() << "Close document!";
break;
}
~~~
msgBox 是一個建立在棧上的`QMessageBox`實例。我們設置其主要文本信息為“The document has been modified.”,informativeText 則是會在對話框中顯示的簡單說明文字。下面我們使用了一個`detailedText`,也就是詳細信息,當我們點擊了詳細信息按鈕時,對話框可以自動顯示更多信息。我們自己定義的對話框的按鈕有三個:保存、丟棄和取消。然后我們使用了`exec()`是其成為一個模態對話框,根據其返回值進行相應的操作。
同時在 KDE 和 Windows 7 上編譯運行一下上面的代碼,我們可以看到一些區別:
[](http://files.devbean.net/images/2012/09/qmessagebox-demo-kde.png)
[](http://files.devbean.net/images/2012/09/qmessagebox-demo-win7.png)
除去對話框樣式,我們值得注意的是`QMessageBox`下方按鈕的排列順序。KDE 上是 Show Details…、Save、Discard 和 Cancel;而 Windows 7 上則是 Save、Discard、Show Details… 和 Cancel。我們并沒有指定按鈕的順序,Qt 已經幫我們按照不同平臺的使用習慣對其進行了調整。這一點在 Mac OS 上也會有相應的體現。對于一個普通的`QDialog`而言,Qt 使用的是`QDialogButtonBox`這個類來實現不同平臺的對話框按鈕順序的顯示的。更多細節請參考這個類的文檔。
- (1)序
- (2)Qt 簡介
- (3)Hello, world!
- (4)信號槽
- (5)自定義信號槽
- (6)Qt 模塊簡介
- (7)MainWindow 簡介
- (8)添加動作
- (9)資源文件
- (10)對象模型
- (11)布局管理器
- (12)菜單欄、工具欄和狀態欄
- (13)對話框簡介
- (14)對話框數據傳遞
- (15)標準對話框 QMessageBox
- (16)深入 Qt5 信號槽新語法
- (17)文件對話框
- (18)事件
- (19)事件的接受與忽略
- (21)事件過濾器
- (22)事件總結
- (23)自定義事件
- (24)Qt 繪制系統簡介
- (25)畫刷和畫筆
- (26)反走樣
- (27)漸變
- (28)坐標系統
- (29)繪制設備
- (30)Graphics View Framework
- (31)貪吃蛇游戲(1)
- (32)貪吃蛇游戲(2)
- (33)貪吃蛇游戲(3)
- (34)貪吃蛇游戲(4)
- (35)文件
- (36)二進制文件讀寫
- (37)文本文件讀寫
- (38)存儲容器
- (39)遍歷容器
- (40)隱式數據共享
- (41)model/view 架構
- (42)QListWidget、QTreeWidget 和 QTableWidget
- (43)QStringListModel
- (44)QFileSystemModel
- (45)模型
- (46)視圖和委托
- (47)視圖選擇
- (48)QSortFilterProxyModel
- (49)自定義只讀模型
- (50)自定義可編輯模型
- (51)布爾表達式樹模型
- (52)使用拖放
- (53)自定義拖放數據
- (54)剪貼板
- (55)數據庫操作
- (56)使用模型操作數據庫
- (57)可視化顯示數據庫數據
- (58)編輯數據庫外鍵
- (59)使用流處理 XML
- (60)使用 DOM 處理 XML
- (61)使用 SAX 處理 XML
- (62)保存 XML
- (63)使用 QJson 處理 JSON
- (64)使用 QJsonDocument 處理 JSON
- (65)訪問網絡(1)
- (66)訪問網絡(2)
- (67)訪問網絡(3)
- (68)訪問網絡(4)
- (69)進程
- (70)進程間通信
- (71)線程簡介
- (72)線程和事件循環
- (73)Qt 線程相關類
- (74)線程和 QObject
- (75)線程總結
- (76)QML 和 QtQuick 2
- (77)QML 語法
- (78)QML 基本元素
- (79)QML 組件
- (80)定位器
- (81)元素布局
- (82)輸入元素
- (83)Qt Quick Controls
- (84)Repeater
- (85)動態視圖
- (86)視圖代理
- (87)模型-視圖高級技術
- (88)Canvas
- (89)Canvas(續)