Qt QMessageBox類(lèi)使用教程
前言
QMessageBox 是 Qt 框架中常用的一個(gè)類(lèi),可以生成各式各樣、各種用途的消息對(duì)話(huà)框,如圖 1 所示。
圖 1 QMessageBox消息對(duì)話(huà)框
很多 GUI 程序都會(huì)用到消息對(duì)話(huà)框,且很多場(chǎng)景中使用的消息對(duì)話(huà)框是類(lèi)似的,唯一的區(qū)別只是提示信息不同。為了提高程序員的開(kāi)發(fā)效率,避免重復(fù)地“造輪子”,Qt 開(kāi)發(fā)者設(shè)計(jì)好了幾種通用的 QMessageBox 消息對(duì)話(huà)框,需要時(shí)可以直接使用。
通用的QMessageBox消息框
Qt 提供了 6 種通用的 QMessageBox 消息對(duì)話(huà)框,通過(guò)調(diào)用 QMessageBox 類(lèi)中的 6 個(gè)靜態(tài)成員方法,可以直接在項(xiàng)目中使用它們。
1) information消息對(duì)話(huà)框
information 對(duì)話(huà)框常用于給用戶(hù)提示一些關(guān)鍵的信息,它的外觀(guān)如下圖所示:
圖 2 information 消息對(duì)話(huà)框
在項(xiàng)目中使用 information 消息對(duì)話(huà)框,直接調(diào)用 QMessageBox 類(lèi)中的 information() 靜態(tài)成員方法即可,該方法的語(yǔ)法格式如下:
StandardButton QMessageBox::information(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
各個(gè)參數(shù)的含義是:
- parent:指定消息對(duì)話(huà)框的父窗口,消息提示框會(huì)作為一個(gè)獨(dú)立的窗口顯示在父窗口的前面。消息提示框從彈出到關(guān)閉的整個(gè)過(guò)程中,用戶(hù)無(wú)法操作父窗口,更不能刪除父窗口;
- title:指定消息對(duì)話(huà)框的標(biāo)題,即圖 2 中的 Titile;
- text:指定消息對(duì)話(huà)框的具體內(nèi)容,即圖 2 中的 text;
- buttons:指定消息對(duì)話(huà)框中包含的按鈕。默認(rèn)情況下,消息對(duì)話(huà)框只包含一個(gè)按鈕,即圖 2 中顯示的 "OK" 按鈕。根據(jù)需要,我們可以用|按位或運(yùn)算符在消息對(duì)話(huà)框中設(shè)置多個(gè)按鈕,例如 QMessageBox::Ok|QMessageBox::Cancel;
- defaultButton:指定 Enter 回車(chē)鍵對(duì)應(yīng)的按鈕,用戶(hù)按下回車(chē)鍵時(shí)就等同于按下此按鈕。注意,defaultButton 參數(shù)的值必須是 buttons 中包含的按鈕,當(dāng)然也可以不手動(dòng)指定,QMessageBox 會(huì)自動(dòng)從 buttons 中選擇合適的按鈕作為 defaultButton 的值。
information() 函數(shù)會(huì)返回用戶(hù)按下的按鈕。StandardButton 是 QMessageBox 類(lèi)中定義的枚舉類(lèi)型,每個(gè)枚舉值代表一種按鈕。StandardButton 類(lèi)型中的值有很多,下表給大家羅列了幾個(gè)常用的:
表 1 QMessageBox::StandardButton 枚舉類(lèi)型值
枚舉值 | 含 義 |
---|---|
QMessageBox::Ok | 標(biāo)有 "OK" 字樣的按鈕,通常用來(lái)表示用戶(hù)接受或同意提示框中顯示的信息。 |
QMessageBox::Open | 標(biāo)有 "Open" 字樣的按鈕。 |
QMessageBox::Save | 標(biāo)有 "Save" 字樣的按鈕。 |
QMessageBox::Cancel | 標(biāo)有 "Cancel" 字樣的按鈕。點(diǎn)擊此按鈕,通常表示用戶(hù)拒絕接受提示框中顯示的信息。 |
QMessageBox::Close | 標(biāo)有 "Close" 字樣的按鈕。 |
QMessageBox::Discard | 標(biāo)有 "Discard" 或者 "Don't Save" 字樣的按鈕,取決于運(yùn)行平臺(tái)。 |
QMessageBox::Apply | 標(biāo)有 "Apply" 字樣的按鈕。 |
QMessageBox::Reset | 標(biāo)有 "Reset" 字樣的按鈕。 |
QMessageBox::Yes | 標(biāo)有 "Yes" 字樣的按鈕。 |
QMessageBox::No | 標(biāo)有 "No" 字樣的按鈕。 |
例如,使用 information() 函數(shù)實(shí)現(xiàn)圖 2 所示的對(duì)話(huà)框,實(shí)現(xiàn)代碼為:
QMessageBox::StandardButton result = QMessageBox::information(&widget, "Title","text");
其中,widget 是我們創(chuàng)建好的 QWidget 窗口,創(chuàng)建好的 information 對(duì)話(huà)框會(huì)顯示在 widget 窗口的前面。通過(guò)用 result 接收 information() 函數(shù)的返回值,我們可以得知用戶(hù)選擇的是哪個(gè)按鈕。
2) critical消息對(duì)話(huà)框
critical 消息對(duì)話(huà)框常用于給用戶(hù)提示“操作錯(cuò)誤”或“運(yùn)行失敗”的信息,它的外觀(guān)如下圖所示:
圖 3 critical 消息對(duì)話(huà)框
項(xiàng)目中使用 critical 消息對(duì)話(huà)框,直接調(diào)用 QMessageBox 類(lèi)提供的 critical() 靜態(tài)成員方法即可,該方法的語(yǔ)法格式為:
StandardButton QMessageBox::critical(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
各個(gè)參數(shù)的含義以及返回值的含義,都與 information() 函數(shù)相同,這里不再重復(fù)贅述。
例如,使用 critical() 函數(shù)實(shí)現(xiàn)圖 3 所示的對(duì)話(huà)框,實(shí)現(xiàn)代碼為:
QMessageBox::StandardButton result=QMessageBox::critical(&widget, "Title","text");
其中,widget 是我們創(chuàng)建好的 QWidget 窗口,創(chuàng)建好的 critical 對(duì)話(huà)框會(huì)顯示在 widget 窗口的前面。
3) question消息對(duì)話(huà)框
question 對(duì)話(huà)框常用于向用戶(hù)提出問(wèn)題并接收用戶(hù)的答案,它的外觀(guān)如下圖所示:
圖 4 question消息對(duì)話(huà)框
項(xiàng)目中使用 question 對(duì)話(huà)框,可以直接調(diào)用 QMessageBox 類(lèi)的 question() 靜態(tài)成員方法,該方法的語(yǔ)法格式為:
StandardButton QMessageBox::question(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
各個(gè)參數(shù)的含義以及返回值的含義,都與 information() 函數(shù)相同。
例如,使用 question() 函數(shù)實(shí)現(xiàn)圖 4 所示的對(duì)話(huà)框,實(shí)現(xiàn)代碼為:
QMessageBox::StandardButton result=QMessageBox::question(&widget, "Title","text");
其中,widget 是我們創(chuàng)建好的 QWidget 窗口,創(chuàng)建好的 question 對(duì)話(huà)框會(huì)顯示在 widget 窗口的前面。
4) warning消息對(duì)話(huà)框
warining 對(duì)話(huà)框常用于向用戶(hù)顯示一些警告信息,它的外觀(guān)如下圖所示:
圖 5 warning消息對(duì)話(huà)框
項(xiàng)目中使用 warning 對(duì)話(huà)框,可以直接調(diào)用 QMessageBox 類(lèi)的 warning() 靜態(tài)成員方法,該方法的語(yǔ)法格式為:
StandardButton QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
各個(gè)參數(shù)的含義以及返回值的含義,都與 information() 函數(shù)相同。
例如,使用 warning() 函數(shù)實(shí)現(xiàn)圖 5 所示的對(duì)話(huà)框,實(shí)現(xiàn)代碼為:
QMessageBox::StandardButton result=QMessageBox::warning(&widget, "Title","text");
其中,widget 是我們創(chuàng)建好的 QWidget 窗口,創(chuàng)建好的 warning 對(duì)話(huà)框會(huì)顯示在 widget 窗口的前面。
5) about和aboutQt對(duì)話(huà)框
about 對(duì)話(huà)框常常作為介紹某個(gè)產(chǎn)品或某項(xiàng)功能的臨時(shí)窗口,它的外觀(guān)如下圖所示:
圖 6 about消息對(duì)話(huà)框
注意,about 對(duì)話(huà)框沒(méi)有固定的圖標(biāo),它顯示的圖標(biāo)可能來(lái)自父窗口、包含父窗口的頂層窗口等,也可能使用和 information 對(duì)話(huà)框相同的圖標(biāo)。
項(xiàng)目中使用 about 對(duì)話(huà)框,直接調(diào)用 QMessageBox 類(lèi)提供的 about() 靜態(tài)成員方法即可,該方法的語(yǔ)法格式如下:
void QMessageBox::about(QWidget *parent, const QString &title, const QString &text)
各個(gè)參數(shù)的含義和與 information() 函數(shù)相同。和前面的幾種對(duì)話(huà)框不同,about對(duì)話(huà)框中只包含一個(gè)默認(rèn)的 Ok 按鈕,且 about() 函數(shù)沒(méi)有返回值。
aboutQt 可以看做是 about 對(duì)話(huà)框的一個(gè)具體實(shí)例,它只能顯示 Qt 的介紹信息,如下圖所示:
圖 7 aboutQt對(duì)話(huà)框
項(xiàng)目中使用 aboutQt 對(duì)話(huà)框,直接調(diào)用 QMessageBox 類(lèi)提供的 aboutQt() 靜態(tài)成員方法即可,該函數(shù)的語(yǔ)法格式如下:
void QMessageBox::aboutQt(QWidget *parent, const QString &title = QString())
我們只能設(shè)置 aboutQt 對(duì)話(huà)框的 parent 父窗口和 title 標(biāo)題,不能自定義它的內(nèi)容。所以在實(shí)際場(chǎng)景中,aboutQt() 對(duì)話(huà)框很少使用。
自定義QMessageBox對(duì)話(huà)框
以上 6 種通用的 QMessageBox 對(duì)話(huà)框,界面上的圖片無(wú)法修改,按鈕上的文字也無(wú)法修改(例如無(wú)法將 OK、No 改成中文)。如果想修改它們,就需要自定義一個(gè) QMessageBox 對(duì)話(huà)框。
QMessageBox對(duì)話(huà)框的創(chuàng)建
程序中創(chuàng)建 QMessageBox 對(duì)象,必須先引入<QMessageBox>頭文件。QMessageBox 類(lèi)提供了兩個(gè)構(gòu)造函數(shù),分別是:
QMessageBox::QMessageBox(QWidget *parent = Q_NULLPTR) QMessageBox::QMessageBox(Icon icon, const QString &title, const QString &text, StandardButtons buttons = NoButton, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint)
第一個(gè)構(gòu)造函數(shù)可以創(chuàng)建一個(gè)“空白”對(duì)話(huà)框,即對(duì)話(huà)框中不包含任何文本和按鈕。當(dāng)然,通過(guò)調(diào)用 QMessageBox 類(lèi)提供的成員方法,可以向“空白”對(duì)話(huà)框中添加各種元素(圖標(biāo)、文本、按鈕等)。
第二個(gè)構(gòu)造函數(shù)中,各個(gè)參數(shù)的含義是:
- icon:指定對(duì)話(huà)框中的圖片。Icon 是 QMessageBox 類(lèi)中定義的枚舉類(lèi)型,內(nèi)部包含 QMessageBox::NoIcon、QMessageBox::Question、QMessageBox::Information、QMessageBox::Warning、QMessageBox::Critical 幾個(gè)值,分別表示:不指定圖片、question對(duì)話(huà)框的圖片(圖 4)、information對(duì)話(huà)框的圖片(圖 2)、warning對(duì)話(huà)框的圖片(圖 5)、critical對(duì)話(huà)框的圖片(圖 3)。
- title:指定對(duì)話(huà)框的標(biāo)題;
- text:指定對(duì)話(huà)框中顯示的文本信息;
- buttons:指定對(duì)話(huà)框中包含的的按鈕,可選值如表 1 所示。
- parent:指定對(duì)話(huà)框的父窗口;
- f:指定對(duì)話(huà)框的屬性。WindowFlags 是 Qt 提供的枚舉類(lèi)型,內(nèi)部包含的值有很多,有的用來(lái)指定對(duì)話(huà)框的用途(比如 Qt::Dialog 表示對(duì)話(huà)框窗口),有的用來(lái)指定對(duì)話(huà)框的外觀(guān)(比如 MSWindowsFixedSizeDialogHint 表示給對(duì)話(huà)框添加一個(gè)細(xì)的邊框)
?舉個(gè)簡(jiǎn)單的例子:
#include <QApplication> #include <QMessageBox> int main(int argc, char *argv[]) { QApplication a(argc, argv); //創(chuàng)建 QMessageBox 類(lèi)對(duì)象 QMessageBox MyBox(QMessageBox::Question,"Title","text",QMessageBox::Yes|QMessageBox::No); //使 MyBox 對(duì)話(huà)框顯示 MyBox.exec(); return a.exec(); }
程序中創(chuàng)建了一個(gè) MyBox 對(duì)話(huà)框,通過(guò)調(diào)用 QMessageBox 提供的 exec() 方法,可以使 MyBox 對(duì)話(huà)框彈出。運(yùn)行程序可以發(fā)現(xiàn),MyBox 對(duì)話(huà)框的外觀(guān)和圖 4 的 question 對(duì)話(huà)框完全一樣。
QMessageBox對(duì)話(huà)框的使用
QMessageBox 類(lèi)提供了很多功能實(shí)用的成員方法,方便我們快速地制作出實(shí)際場(chǎng)景需要的對(duì)話(huà)框。
下表給大家羅列了常用的一些 QMessageBox 類(lèi)成員方法:
表 2 QMessageBox 常用成員方法
成員方法 | 功 能 |
---|---|
void QMessageBox::setWindowTitle(const QString &title) | 設(shè)置對(duì)話(huà)框的標(biāo)題。 |
void setText(const QString &text) | 設(shè)置對(duì)話(huà)框中要顯示的文本。 |
void setIconPixmap(const QPixmap &pixmap) | 設(shè)置對(duì)話(huà)框中使用的圖片。 |
QAbstractButton *QMessageBox::clickedButton() const | 返回用戶(hù)點(diǎn)擊的按鈕。 |
QPushButton *QMessageBox::addButton(const QString &text, ButtonRole role) | 向?qū)υ?huà)框中添加按鈕,text 為按鈕的文本,role 是 QMessageBox::ButtonRole 枚舉類(lèi)型的變量,用于描述按鈕扮演的角色,它的可選值有?QMessageBox::AcceptRole(同 OK 按鈕)、QMessageBox::RejectRole(同 Cancel 按鈕)等。 |
int QMessageBox::exec() | 使當(dāng)前對(duì)話(huà)框彈出,除非用戶(hù)關(guān)閉對(duì)話(huà)框,否則對(duì)話(huà)框?qū)⒁恢贝嬖?。此外,?dāng)對(duì)話(huà)框中使用的都是 Qt 提供的按鈕時(shí),該方法可以監(jiān)聽(tīng)用戶(hù)點(diǎn)擊的是哪個(gè)按鈕,并將該按鈕對(duì)應(yīng)的枚舉值返回;如果對(duì)話(huà)框中包含自定義按鈕,需要借助 clickedButton() 方法確定用戶(hù)點(diǎn)擊的按鈕。 |
舉個(gè)簡(jiǎn)單的例子:
#include <QApplication> #include <QMessageBox> #include <QPushButton> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMessageBox MBox; MBox.setWindowTitle("QMessageBox自定義對(duì)話(huà)框"); MBox.setText("這是一個(gè)自定義的對(duì)話(huà)框"); MBox.setIconPixmap(QPixmap("C:\\Users\\xiexuewu\\Desktop\\icon_c.png")); QPushButton *agreeBut = MBox.addButton("同意", QMessageBox::AcceptRole); MBox.exec(); if (MBox.clickedButton() == (QAbstractButton*)agreeBut) { //在 Qt Creator 的輸出窗口中輸出指定字符串 qDebug() << "用戶(hù)點(diǎn)擊了同意按鈕"; } return a.exec(); }
程序運(yùn)行結(jié)果如圖 8 所示,點(diǎn)擊“同意”按鈕后,我們會(huì)在 Qt Creator 的輸出窗口中看到“用戶(hù)點(diǎn)擊了同意按鈕”。
圖 8 自定義的 QMessageBox 對(duì)話(huà)框
QMessageBox的信號(hào)和槽
操作 QMessageBox 對(duì)話(huà)框,最常用的信號(hào)函數(shù)是 buttonClicked() 函數(shù),最常用的槽函數(shù)是 exec() 函數(shù),它們的語(yǔ)法格式和功能如下表所示。?
表 3 QMessageBox信號(hào)和槽
信號(hào)函數(shù) | 功 能 |
---|---|
void QMessageBox::buttonClicked(QAbstractButton *button) | 當(dāng)用戶(hù)點(diǎn)擊對(duì)話(huà)框中的某個(gè)按鈕時(shí),會(huì)觸發(fā)此信號(hào)函數(shù),該函數(shù)會(huì)將用戶(hù)點(diǎn)擊的按鈕作為參數(shù)傳遞給槽函數(shù)。 |
槽函數(shù) | 功 能 |
int QMessageBox::exec() | 彈出對(duì)話(huà)框,直到用戶(hù)手動(dòng)關(guān)閉對(duì)話(huà)框,此對(duì)話(huà)框?qū)⒁恢贝嬖凇?/td> |
舉個(gè)簡(jiǎn)單的例子:
//main.cpp #include <QApplication> #include <QWidget> #include <QMessageBox> #include <QPushButton> #include <QAbstractButton> QPushButton* agreeBut; QPushButton* disagreeBut; class MyWidget:public QWidget{ Q_OBJECT public slots: void buttonClicked(QAbstractButton * butClicked); }; void MyWidget::buttonClicked(QAbstractButton * butClicked){ if(butClicked == (QAbstractButton*)disagreeBut){ this->close(); } } int main(int argc, char *argv[]) { QApplication a(argc, argv); //創(chuàng)建主窗口 MyWidget myWidget; myWidget.setWindowTitle("主窗口"); myWidget.resize(400,300); //創(chuàng)建消息框 QMessageBox MyBox(QMessageBox::Question,"",""); MyBox.setParent(&myWidget); //設(shè)置消息框的屬性為對(duì)話(huà)框,它會(huì)是一個(gè)獨(dú)立的窗口 MyBox.setWindowFlags(Qt::Dialog); MyBox.setWindowTitle("協(xié)議"); MyBox.setText("使用本產(chǎn)品,請(qǐng)您嚴(yán)格遵守xxx規(guī)定!"); //自定義兩個(gè)按鈕 agreeBut = MyBox.addButton("同意", QMessageBox::AcceptRole); disagreeBut = MyBox.addButton("拒絕", QMessageBox::RejectRole); myWidget.show(); //添加信號(hào)和槽,監(jiān)聽(tīng)用戶(hù)點(diǎn)擊的按鈕,如果用戶(hù)拒絕,則主窗口隨之關(guān)閉。 QObject::connect(&MyBox,&QMessageBox::buttonClicked,&myWidget,&MyWidget::buttonClicked); MyBox.exec(); return a.exec(); } //MyWidget類(lèi)的定義應(yīng)該放到 .h 文件中,本例中將其寫(xiě)到 main.cpp 中,程序最后需要添加 #include "當(dāng)前源文件名.moc" 語(yǔ)句,否則無(wú)法通過(guò)編譯。 #include "main.moc"
程序執(zhí)行結(jié)果為:

?到此這篇關(guān)于Qt QMessageBox類(lèi)使用教程的文章就介紹到這了,更多相關(guān)Qt QMessageBox內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用C語(yǔ)言遞歸實(shí)現(xiàn)火車(chē)調(diào)度算法詳解
本文主要介紹了用C語(yǔ)言遞歸實(shí)現(xiàn)火車(chē)調(diào)度算法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11函數(shù)指針與指針函數(shù)的學(xué)習(xí)總結(jié)
函數(shù)指針是指向函數(shù)的指針,指針函數(shù)是指一個(gè)函數(shù)的返回值是一個(gè)指針。以下就是對(duì)函數(shù)指針與指針函數(shù)的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C++結(jié)構(gòu)體初始化的10種寫(xiě)法總結(jié)
這篇文章主要為大家詳細(xì)介紹了10種C++中結(jié)構(gòu)體初始化的寫(xiě)法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04C語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷(xiāo)毀詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷(xiāo)毀,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02VSCODE+cmake配置C++開(kāi)發(fā)環(huán)境的實(shí)現(xiàn)步驟
這篇文章主要介紹了VSCODE+cmake配置C++開(kāi)發(fā)環(huán)境的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例
這篇文章主要介紹了c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-12-12