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