引用自:
http://c.biancheng.net/view/1870.html(侵刪);
QT為應用程序設計提供了一些常用的標准對話框,如打開文件對話框、選擇顏色對話框、信息提示和確認選擇對話框、標准輸入對話框等,用戶無需再自己設計這些常用的對話框,這樣可以減少程序設計工作量。
在前面幾章的實例中,或多或少地用到了其中的一些對話框。Qt 預定義的各標准對話框的類,及其主要靜態函數的功能見表 1(由於輸入參數一般較多,省略了函數的輸入參數,只列出了函數的返回值類型)。
實例 samp6_1 演示使用這些對話框,程序運行界面如圖 2 所示。下方的文本框顯示打開文件的文件名或一些提示信息,某些對話框的輸入結果可應用於文本框的屬性設置,如字體和顏色。
圖 2 實例 samp6_1 運行界面
QFileDialog::getOpenFileName() 函數返回的是選擇文件的帶路徑的完整文件名,如果在對話框里取消選擇,則返回字符串為空。
靜態函數 QCoreApplication::applicationDirPath() 返回應用程序可執行文件所在的目錄,getExistingDirectory() 函數的返回值是選擇的目錄名稱字符串。
如下面的代碼,即使選擇覆蓋文件,由於代碼里沒有實質地覆蓋原來的文件,也不會對選擇的文件造成任何影響:
圖 3 QinputDialog 4種輸入對話框
其中編輯框響應模式是枚舉類型 QLineEdit::EchoMode,它控制編輯框上文字的顯示方式,正常情況下選擇 QLineEdit::Normal;如果是輸入密碼,選擇 QLineEdit::Password。代碼如下:
例如,warning() 的函數原型是:
warning() 函數的返回結果是 StandardButton 類型。對話框上顯示的按鈕和缺省選中按鈕也是 StandardButton 類型。
StandardButton 是各種按鈕的定義,如 OK、Yes、No、Cancel 等,其枚舉取值是 QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Close 等。
圖 4 QMessageBox 的幾種消息提示對話框
例如,下面是程序中調用 QMessageBox 信息顯示的代碼(顯示的幾個對話框如圖 4 所示):
圖 5 QMessageBox:: question() 生成的對話框
靜態函數 QMessageBox::question() 的原型如下:
下面是產生如圖 5 所示對話框的代碼,並根據對話框選擇結果進行了判斷和顯示:
在前面幾章的實例中,或多或少地用到了其中的一些對話框。Qt 預定義的各標准對話框的類,及其主要靜態函數的功能見表 1(由於輸入參數一般較多,省略了函數的輸入參數,只列出了函數的返回值類型)。
對話框 | 常用靜態函數名稱 | 函數功能 |
---|---|---|
QFileDialog 文件對話框 |
QString getOpenFileName() QStringList getOpenFileNames() QString getSaveFileName() QString getExistingDirectory() QUrl getOpenFileUrl() | 選擇打開一個文件 選擇打開多個文件 選擇保存一個文件 選擇一個己有的目錄 選擇打幵一個文件,可選擇遠程網絡文件 |
QcolorDialog 顏色對話框 |
QColor getColor() | 選擇顏色 |
QFontDialog 字體對話框 |
QFont getFont() | 選擇字體 |
QinputDialog 輸入對話框 |
QString getText() int getlnt() double getDouble() QString getltem() QString getMultiLineText() |
輸入單行文字 輸入整數 輸入浮點數 從一個下拉列表框中選擇輸入 輸入多行字符串 |
QMessageBox 消息框 |
StandardButton information() StandardButton question() StandardButton waming() StandardButton critical() void about() void aboutQt() | 信息提示對話框 詢問並獲取是否確認的對話框 警告信息提示對話框 錯誤信息提示對話框 設置自定義信息的關於對話框 關於Qt的對話框 |
實例 samp6_1 演示使用這些對話框,程序運行界面如圖 2 所示。下方的文本框顯示打開文件的文件名或一些提示信息,某些對話框的輸入結果可應用於文本框的屬性設置,如字體和顏色。

圖 2 實例 samp6_1 運行界面
QFileDialog 對話框
選擇打開一個文件
若要打開一個文件,可調用靜態函數 QFileDialog::getOpenFileName(),“打開一個文件”按鈕的響應代碼如下:void Dialog::on_btnOpen_clicked() { //選擇單個文件 QString curPath=QDir::currentPath();//獲取系統當前目錄 //獲取應用程序的路徑 QString dlgTitle="選擇一個文件"; //對話框標題 QString filter="文本文件(*.txt);;圖片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件過濾器 QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter); if (!aFileName.isEmpty()) ui->plainTextEdit->appendPlainText(aFileName); }QFileDialog::getOpenFileName() 函數需要傳遞 3 個字符串型參數,分別如下:
- 對話框標題,這里設置為"選擇一個文件"。
- 初始化目錄,打開對話框時的初始目錄,這里用QDinxurrentPath()獲取應用程序當前目錄。
- 文件過濾器,設置選擇不同后綴的文件,可以設置多組文件,如:
QString f ilter="文本文件.txt);;圖片文件(* .jpg *.gif *.png);;所有文件(*.*)";
每組文件之間用兩個分號隔開,同一組內不同后綴之間用空格隔開。QFileDialog::getOpenFileName() 函數返回的是選擇文件的帶路徑的完整文件名,如果在對話框里取消選擇,則返回字符串為空。
選擇打開多個文件
若要選擇打開多個文件,可使用靜態函數 QFileDialog::getOpenFileNames(),“打開多個文件”按鈕的響應代碼如下:void Dialog::on_btnOpenMulti_clicked() { //選擇多個文件 //獲取應用程序的路徑 QString curPath=QDir::currentPath();//獲取系統當前目錄 QString dlgTitle="選擇多個文件"; //對話框標題 QString filter="文本文件(*.txt);;圖片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件過濾器 QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter); for (int i=0; i<fileList.count();i++) ui->plainTextEdit->appendPlainText(fileList.at(i)); }getOpenFileNames() 函數的傳遞參數與 getOpenFileName() —樣,只是返回值是一個字符串列表,列表的每一行是選擇的一個文件。
選擇已有目錄
選擇己有目錄可調用靜態函數 QFileDialog::getExistingDirectory(),同樣,若需要傳遞對話框標題和初始路徑,還應傳遞一個選項,一般用 QFileDialog::ShowDirsOnly,表示對話框中只顯示目錄。靜態函數 QCoreApplication::applicationDirPath() 返回應用程序可執行文件所在的目錄,getExistingDirectory() 函數的返回值是選擇的目錄名稱字符串。
選擇保存文件名
選擇一個保存文件,使用靜態函數 QFileDialog::getSaveFileName(),傳遞的參數與 getOpenFileName() 函數相同。只是在調用 getSaveFileName() 函數時,若選擇的是一個己經存在的文件,會提示是否覆蓋原有的文件。如果提示覆蓋,會返回為選擇的文件,但是並不會對文件進行實質操作,對文件的刪除操作需要在選擇文件之后自己編碼實現。如下面的代碼,即使選擇覆蓋文件,由於代碼里沒有實質地覆蓋原來的文件,也不會對選擇的文件造成任何影響:
void Dialog::on_btnSave_clicked() {//保存文件 QString curPath=QCoreApplication::applicationDirPath(); //獲取應用程序的路徑 QString dlgTitle="保存文件"; //對話框標題 QString filter="文本文件(*.txt);;h文件(*.h);;C++文件(.cpp);;所有文件(*.*)"; //文件過濾器 QString aFileName=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter); if (!aFileName.isEmpty()) ui->plainTextEdit->appendPlainText(aFileName); }
QColorDialog 對話框
QColorDialog 是選擇顏色對話框,選擇顏色使用靜態函數 QColorDialog::getColor()。下面是“選擇顏色”按鈕的代碼,它為文本框的字體選擇顏色。void Dialog::on_btnColor_clicked() { QPalette pal=ui->plainTextEdit->palette(); //獲取現有 palette QColor iniColor=pal.color(QPalette::Text); //現有的文字顏色 QColor color=QColorDialog::getColor(iniColor,this,"選擇顏色"); if (color.isValid()) //選擇有效 { pal.setColor(QPalette::Text,color); //palette 設置選擇的顏色 ui->plainTextEdit->setPalette(pal); //設置 palette } }getColor() 函數需要傳遞一個初始的顏色,這里是將palette提取的文本顏色作為初始顏色。getColor() 函數返回一個顏色變量,若在顏色對話框里取消選擇,則返回的顏色值無效,通過 QColor::isValid() 函數來判斷返回是否有效。
QFontDialog 對話框
QFontDialog 是選擇字體對話框,選擇字體使用靜態函數 QFontDialog::getFont()。下面是“選擇字體”按鈕的代碼,它為文本框選擇字體,字體設置的內容包括字體名稱、大小、粗體、斜體等。void Dialog::on_btnFont_clicked() {//選擇字體 QFont iniFont=ui->plainTextEdit->font(); //獲取文本框的字體 bool ok=false; QFont font=QFontDialog::getFont(&ok,iniFont); //選擇字體 if (ok) //選擇有效 ui->plainTextEdit->setFont(font); }gctFont() 返回一個字體變量,但是 QFont 沒有類似於 isValid() 的函數來判斷有效性,所以在調用 getFont() 函數時以引用方式傳遞一個邏輯變量 ok,調用后通過判斷 ok 是否為 true 來判斷字體選擇是否有效。
QInputDialog標准輸入對話框
QInputDialog 有單行字符串輸入、整數輸入、浮點數輸入、列表框選擇輸入和多行文本等多種輸入方式,圖 3 是其中 4 種界面效果。
圖 3 QinputDialog 4種輸入對話框
輸入文字
QInputDialog::getText() 函數顯示一個對話框用於輸入字符串,傳遞的參數包括對話框標題、提示標簽文字、缺省輸入、編輯框響應模式等。其中編輯框響應模式是枚舉類型 QLineEdit::EchoMode,它控制編輯框上文字的顯示方式,正常情況下選擇 QLineEdit::Normal;如果是輸入密碼,選擇 QLineEdit::Password。代碼如下:
void Dialog::on_btnInputString_clicked() { //輸入字符串 QString dlgTitle="輸入文字對話框"; QString txtLabel="請輸入文件名"; QString defaultInput="新建文件.txt"; QLineEdit::EchoMode echoMode=QLineEdit::Normal;//正常文字輸入 //QLineEdit::EchoMode echoMode=QLineEdit::Password;//密碼輸入 bool ok=false; QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode,defaultInput, &ok); if (ok && !text.isEmpty()) ui->plainTextEdit->appendPlainText(text); }
輸入整數
使用 QInputDialog::getInt() 函數輸入一個整數,下面的代碼為文本選擇字體大小:void Dialog::on_btnInputInt_clicked() {//輸入整數 QString dlgTitle="輸入整數對話框"; QString txtLabel="設置字體大小"; int defaultValue=ui->plainTextEdit->font().pointSize(); //現有字體大小 int minValue=6, maxValue=50,stepValue=1; //范圍,步長 bool ok=false; int inputValue = QInputDialog::getInt(this, dlgTitle,txtLabel, defaultValue, minValue,maxValue,stepValue,&ok); if (ok) //是否確認輸入 { QFont font=ui->plainTextEdit->font(); font.setPointSize(inputValue); ui->plainTextEdit->setFont(font); } }輸入整數對話框使用一個 SpinBox 組件輸入整數,getInt() 需要傳遞的參數包括數值大小范圍、步長、初始值,確認選擇輸入后,將輸入的整數值作為文本框字體的大小。
輸入浮點數
使用 QInputDialog::getDouble() 函數輸入一個浮點數,輸入對話框使用一個 QDoubleSpinBox 作為輸入組件,getDouble() 的輸入參數需要輸入范圍、初始值、小數點位數等。代碼如下:void Dialog::on_btnInputFloat_clicked() { //輸入浮點數 QString dlgTitle="輸入浮點數對話框"; QString txtLabel="輸入一個浮點數"; float defaultValue=3.13; float minValue=0, maxValue=10000; //范圍 int decimals=2;//小數點位數 bool ok=false; float inputValue = QInputDialog::getDouble(this, dlgTitle,txtLabel, defaultValue, minValue,maxValue,decimals,&ok); if (ok) //確認選擇 { QString str=QString::asprintf("輸入了一個浮點數:%.2f",inputValue); ui->plainTextEdit->appendPlainText(str); } }
下拉列表選擇輸入
使用 QInputDialog::getItem() 可以從一個 ComboBox 組件的下拉列表中選擇輸入。代碼如下:void Dialog::on_btnInputItem_clicked() { //條目選擇輸入 QStringList items; //ComboBox 列表的內容 items <<"優秀"<<"良好"<<"合格"<<"不合格"; QString dlgTitle="條目選擇對話框"; QString txtLabel="請選擇級別"; int curIndex=0; //初始選擇項 bool editable=true; //ComboBox是否可編輯 bool ok=false; QString text = QInputDialog::getItem(this, dlgTitle,txtLabel,items,curIndex,editable,&ok); if (ok && !text.isEmpty()) ui->plainTextEdit->appendPlainText(text); }getItem() 函數需要一個 QStringList 變量為其 ComboBox 組件做條目初始化,curIndex 指明初始選擇項,editable 表示對話框里的ComboBox是否可編輯,若不能編輯,則只能在下拉列表中選擇。
QMessageBox 消息對話框
簡單信息提示
消息對話框 QMessageBox 用於顯示提示、警告、錯誤等信息,或進行確認選擇,由幾個靜態函數實現這些功能(詳見表 1)。其中 warning()、information()、critical() 和 about() 這幾個函數的輸入參數和使用方法相同,只是信息提示的圖標有區別。例如,warning() 的函數原型是:
StandardButton QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
其中,parent 是對話框的父窗口,指定父窗口之后,打開對話框時,對話框將自動顯示在父窗口的上方中間位置;title 是對話框標題字符串;text 是對話框需要顯7K的信息字符串;buttons 是對話框提供的按鈕,缺省只有一個 OK 按鈕;defaultButton 是缺省選擇的按鈕,缺省表示沒有選擇。warning() 函數的返回結果是 StandardButton 類型。對話框上顯示的按鈕和缺省選中按鈕也是 StandardButton 類型。
StandardButton 是各種按鈕的定義,如 OK、Yes、No、Cancel 等,其枚舉取值是 QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Close 等。
詳見 Qt 幫助文檔中的StandardButton 類型的說明。
對於 warning()、information()、critical() 和 about() 這幾種對話框,它們一般只有一個 OK 按鈕,且無須關心對話框的返回值。所以,使用缺省的按鈕設置即可。
圖 4 QMessageBox 的幾種消息提示對話框
例如,下面是程序中調用 QMessageBox 信息顯示的代碼(顯示的幾個對話框如圖 4 所示):
void Dialog::on_btnMsgInformation_clicked() { QString dlgTitle="information消息框"; QString strInfo="文件已經打開,字體大小已設置"; QMessageBox::information(this, dlgTitle, strInfo, QMessageBox::Ok,QMessageBox::NoButton); } void Dialog::on_btnMsgWarning_clicked() { QString dlgTitle="warning 消息框"; QString strInfo="文件內容已經被修改"; QMessageBox::warning(this, dlgTitle, strInfo); } void Dialog::on_btnMsgCritical_clicked() { QString dlgTitle="critical消息框"; QString strInfo="有不明程序訪問網絡"; QMessageBox::critical(this, dlgTitle, strInfo); } void Dialog::on_btnMsgAbout_clicked() { QString dlgTitle="about消息框"; QString strInfo="我開發的數據查看軟件 V1.0 \n 保留所有版權"; QMessageBox::about(this, dlgTitle, strInfo); }
確認選擇對話框
QMessageBox::question() 函數用於打開一個選擇對話框,提示信息,並提供 Yes、No、OK、Cancel 等按鈕,用戶單擊某個按鈕返回選擇,如常見的文件保存確認對話框如圖 5 所示。
圖 5 QMessageBox:: question() 生成的對話框
靜態函數 QMessageBox::question() 的原型如下:
StandardButton QMessageBox::question(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
question() 對話框的關鍵是在其中可以選擇顯示多個按鈕,例如同時顯示 Yes、No、OK 或 Cancel() 其返回結果也是一個 StandardButton 類型變量,表示哪個按鈕被單擊了。下面是產生如圖 5 所示對話框的代碼,並根據對話框選擇結果進行了判斷和顯示:
void Dialog::on_btnMsgQuestion_clicked() { QString dlgTitle="Question消息框"; QString strInfo="文件已被修改,是否保存修改?"; QMessageBox::StandardButton defaultBtn=QMessageBox::NoButton; //缺省按鈕 QMessageBox::StandardButton result;//返回選擇的按鈕 result=QMessageBox::question(this, dlgTitle, strInfo, QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel, defaultBtn); if (result==QMessageBox::Yes) ui->plainTextEdit->appendPlainText("Question消息框: Yes 被選擇"); else if(result==QMessageBox::No) ui->plainTextEdit->appendPlainText("Question消息框: No 被選擇"); else if(result==QMessageBox::Cancel) ui->plainTextEdit->appendPlainText("Question消息框: Cancel 被選擇"); else ui->plainTextEdit->appendPlainText("Question消息框: 無選擇"); }