好久沒(méi)有更新博客,主要是公司里面還在驗(yàn)收一些東西,所以沒(méi)有及時(shí)更新。而且也在寫(xiě)一個(gè)基于 Qt 的畫(huà)圖程序,基本上類(lèi)似于 PS 的東西,主要用到的是 Qt Graphics View Framework。好了,現(xiàn)在還是繼續(xù)來(lái)說(shuō)說(shuō) Qt 的標(biāo)準(zhǔn)對(duì)話框吧!
這次來(lái)說(shuō)一下 QMessageBox 以及類(lèi)似的幾種對(duì)話框。其實(shí),我們已經(jīng)用過(guò) QMessageBox 了,就在之前的幾個(gè)程序中。不過(guò),當(dāng)時(shí)是大略的說(shuō)了一下,現(xiàn)在專(zhuān)門(mén)來(lái)說(shuō)說(shuō)這幾種對(duì)話框。
先來(lái)看一下最熟悉的 QMessageBox::information。我們?cè)谝郧暗拇a中這樣使用過(guò):
QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
下面是一個(gè)簡(jiǎn)單的例子:
現(xiàn)在我們從 API 中看看它的函數(shù)簽名:
static StandardButton QMessageBox::information ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton );
首先,它是 static 的,所以我們能夠使用類(lèi)名直接訪問(wèn)到(怎么看都像廢話…);然后看它那一堆參數(shù),第一個(gè)參數(shù) parent,說(shuō)明它的父組件;第二個(gè)參數(shù) title,也就是對(duì)話框的標(biāo)題;第三個(gè)參數(shù) text,是對(duì)話框顯示的內(nèi)容;第四個(gè)參數(shù) buttons,聲明對(duì)話框放置的按鈕,默認(rèn)是只放置一個(gè) OK 按鈕,這個(gè)參數(shù)可以使用或運(yùn)算,例如我們希望有一個(gè) Yes 和一個(gè) No 的按鈕,可以使用 QMessageBox::Yes | QMessageBox::No,所有的按鈕類(lèi)型可以在 QMessageBox 聲明的 StandarButton 枚舉中找到;第五個(gè)參數(shù) defaultButton 就是默認(rèn)選中的按鈕,默認(rèn)值是 NoButton,也就是哪個(gè)按鈕都不選中。這么多參數(shù),豆子也是記不住的??!所以,我們?cè)谟?QtCreator 寫(xiě)的時(shí)候,可以在輸入QMessageBox::information 之后輸入(,稍等一下,QtCreator 就會(huì)幫我們把函數(shù)簽名顯示在右上方了,還是挺方便的一個(gè)功能!
Qt 提供了五個(gè)類(lèi)似的接口,用于顯示類(lèi)似的窗口。具體代碼這里就不做介紹,只是來(lái)看一下樣子吧!
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");
請(qǐng)注意,最后一個(gè) about()函數(shù)是沒(méi)有后兩個(gè)關(guān)于 button 設(shè)置的按鈕的!
QMessageBox 對(duì)話框的文本信息時(shí)可以支持 HTML 標(biāo)簽的。例如:
QMessageBox::about(NULL, "About", "About this <font color='red'>application</font>");
運(yùn)行效果如下:
如果我們想自定義圖片的話,也是很簡(jiǎn)單的。這時(shí)候就不能使用這幾個(gè) static 的函數(shù)了,而是要我們自己定義一個(gè) QMessagebox 來(lái)使用:
QMessageBox message(QMessageBox::NoIcon, "Title", "Content with icon.");
message.setIconPixmap(QPixmap("icon.png"));
message.exec();
這里我們使用的是 exec()函數(shù),而不是 show(),因?yàn)檫@是一個(gè)模態(tài)對(duì)話框,需要有它自己的事件循環(huán),否則的話,我們的對(duì)話框會(huì)一閃而過(guò)哦(感謝 laetitia 提醒).
需要注意的是,同其他的程序類(lèi)似,我們?cè)诔绦蛑卸x的相對(duì)路徑都是要相對(duì)于運(yùn)行時(shí)的.exe 文件的地址的。比如我們寫(xiě)"icon.png",意思是是在.exe 的當(dāng)前目錄下尋找一個(gè)"icon.png"的文件。這個(gè)程序的運(yùn)行效果如下:
還有一點(diǎn)要注意,我們使用的是 png 格式的圖片。因?yàn)?Qt 內(nèi)置的處理圖片格式是 png,所以這不會(huì)引起很大的麻煩,如果你要使用 jpeg 格式的圖片的話,Qt 是以插件的形式支持的。在開(kāi)發(fā)時(shí)沒(méi)有什么問(wèn)題,不過(guò)如果要部署的話,需要注意這一點(diǎn)。
最后再來(lái)說(shuō)一下怎么處理對(duì)話框的交互。我們使用 QMessageBox 類(lèi)的時(shí)候有兩種方式,一是使用static 函數(shù),另外是使用構(gòu)造函數(shù)。
首先來(lái)說(shuō)一下 static 函數(shù)的方式。注意,static 函數(shù)都是要返回一個(gè) StandardButton,我們就可以通過(guò)判斷這個(gè)返回值來(lái)對(duì)用戶(hù)的操作做出相應(yīng)。
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");
如果要使用構(gòu)造函數(shù)的方式,那么我們就要自己運(yùn)行判斷一下啦:
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");
}
其實(shí)道理上也是差不多的。
本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031
更多建議: