1. 程式人生 > >QT QMessageBox 詳解

QT QMessageBox 詳解

現在還是繼續來說說Qt的標準對話方塊吧!
這次來說一下QMessageBox以及類似的幾種對話方塊。
先來看一下最熟悉的QMessageBox::information。我們在以前的程式碼中這樣使用過:

 QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);

如果寫成這樣:

QMessageBox::Information(this,tr("Image Viewer"),tr("Cannot load %1.").arg(fileName));

中的,Information有問題,應該是information,沒注意首字母大小寫,QMessageBox::information,才是靜態成員函式。

編譯報錯:

/home/xiaofeng/qt/CommandLinkButton/ComLinButton/mainwindow.cpp:48:

錯誤:'(QMessageBox::Icon)1u' cannot be used as a function


下面是一個簡單的例子:
 
現在我們從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.show();
需要注意的是,同其他的程式類似,我們在程式中定義的相對路徑都是要相對於執行時的.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"); 
 }
其實道理上也是差不多的。