引用自:
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消息框: 無選擇");
}
