很久沒有更新博客,主要是公司裏面還在驗收一些東西,因此沒有及時更新。並且也在寫一個基於Qt的畫圖程序,基本上相似於PS的東西,主要用到的是Qt Graphics View Framework。好了,如今仍是繼續來講說Qt的標準對話框吧!
此次來講一下QMessageBox以及相似的幾種對話框。其實,咱們已經用過QMessageBox了,就在以前的幾個程序中。不過,當時是大略的說了一下,如今專門來講說這幾種對話框。
先來看一下最熟悉的QMessageBox::information。咱們在之前的代碼中這樣使用過:
QMessageBox::information(NULL,
"Title",
"Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
下面是一個簡單的例子:
如今咱們從API中看看它的函數簽名:
static StandardButton QMessageBox::information ( QWidget * parent,
const QString & title,
const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton );
首先,它是static的,因此咱們可以使用類名直接訪問到(怎麼看都像廢話…);而後看它那一堆參數,第一個參數parent,說明它的父組件;第二個參數title,也就是對話框的標題;第三個參數text,是對話框顯示的內容;第四個參數buttons,聲明對話框放置的按鈕,默認是隻放置一個OK按鈕,這個參數可使用或運算,例如咱們但願有一個Yes和一個No的按鈕,可使用
QMessageBox::Yes | QMessageBox::No,全部的按鈕類型能夠在QMessageBox聲明的StandarButton枚舉中找到;第五個參數defaultButton就是默認選中的按鈕,默認值是NoButton,也就是哪一個按鈕都不選中。這麼多參數,豆子也是記不住的啊!因此,咱們在用QtCreator寫的時候,能夠在輸入QMessageBox::information以後輸入(,稍等一下,QtCreator就會幫咱們把函數簽名顯示在右上方了,仍是挺方便的一個功能!
Qt提供了五個相似的接口,用於顯示相似的窗口。具體代碼這裏就不作介紹,只是來看一下樣子吧!
QMessageBox::critical(NULL,
"critical",
"Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::warning(NULL,
"warning",
"Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::question(NULL,
"question",
"Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::about(NULL,
"About",
"About this application");
請注意,最後一個about()函數是沒有後兩個關於button設置的按鈕的!
QMessageBox對話框的文本信息時能夠支持HTML標籤的。例如:
QMessageBox::about(NULL,
"About",
"About this <font color='red'>application</font>");
運行效果以下:
若是咱們想自定義圖片的話,也是很簡單的。這時候就不能使用這幾個static的函數了,而是要咱們本身定義一個QMessagebox來使用:
QMessageBox message(QMessageBox::NoIcon,
"Title",
"Content with icon.");
message.setIconPixmap(QPixmap(
"icon.png"));
message.exec();
這裏咱們使用的是exec()函數,而不是show(),由於這是一個模態對話框,須要有它本身的事件循環,不然的話,咱們的對話框會一閃而過哦(感謝laetitia提醒).
須要注意的是,同其餘的程序相似,咱們在程序中定義的相對路徑都是要相對於運行時的.exe文件的地址的。好比咱們寫"icon.png",意思是是在.exe的當前目錄下尋找一個"icon.png"的文件。這個程序的運行效果以下:
還有一點要注意,咱們使用的是png格式的圖片。由於Qt內置的處理圖片格式是png,因此這不會引發很大的麻煩,若是你要使用jpeg格式的圖片的話,Qt是以插件的形式支持的。在開發時沒有什麼問題,不過若是要部署的話,須要注意這一點。
最後再來講一下怎麼處理對話框的交互。咱們使用QMessageBox類的時候有兩種方式,一是使用static函數,另外是使用構造函數。
首先來講一下static函數的方式。注意,static函數都是要返回一個StandardButton,咱們就能夠經過判斷這個返回值來對用戶的操做作出相應。
QMessageBox::StandardButton rb = QMessageBox::question(NULL,
"Show Qt",
"Do you want to show Qt dialog?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
if(rb == QMessageBox::Yes)
{
QMessageBox::aboutQt(NULL,
"About Qt");
}
若是要使用構造函數的方式,那麼咱們就要本身運行判斷一下啦:
QMessageBox message(QMessageBox::NoIcon,
"Show Qt",
"Do you want to show Qt dialog?", QMessageBox::Yes | QMessageBox::No, NULL);
if(message.exec() == QMessageBox::Yes)
{
QMessageBox::aboutQt(NULL,
"About Qt");
}
其實道理上也是差很少的。