一、概述
本文用一個例子講述Qt幾種基本對話框的使用,包括QDialog、QFileDialog、QColorDialog、QFontDialog、QInputDialog、QMessageBox這幾種。中間還會講到如何實作ui的互相調用、中文顯示問題等。
源碼下載下傳:
Qt基本對話框
二、功能描述
先來看一下我們要實作哪些功能:
1、在主對話框中包含 QFileDialog、QColorDialog、QFontDialog、QInputDialog、QMessageBox 五種對話框的啟動按鈕。

2、點選“标準檔案對話框”,彈出QFileDialog,右側的QLineEdit中顯示檔案名;
3、點選“标準顔色對話框”,彈出QColorDialog,右側QFrame中顯示選擇的顔色;
4、點選“标準字型對話框”,彈出QFontDialog,右側文字改變字型;
5、點選“标準輸入對話框”,彈出新的QDialog,在子對話框中點選“修改”彈出QInputDialog,可以輸入和更改資訊;
6、點選“标準資訊對話框”,彈出新的QDialog,在自對話框中點選不同的消息對話框彈出不同種類的QMessageBox。
三、功能實作
本例依然采用ui+code的方法來實作上述功能。
根據上面的功能說明,除了主Dialog外,還需添加input和message的2個額外二級子對話框供主對話框調用。
工程目錄如下:
1、标準檔案對話框
右鍵按鈕,添加槽函數
void basedialog::on_fileButton_clicked()
{
QString filename = QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("打開檔案"),"C:/");
ui->filelineEdit->setText(filename);
}
這裡我們隻是通過getOpenFileName()函數擷取檔案名,F2查到其函數原型為:
static QString getOpenFileName(QWidget *parent = Q_NULLPTR,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = Q_NULLPTR,
Options options = Options());
F1查詢使用文檔有用法示例:
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
"/home",
tr("Images (*.png *.xpm *.jpg)"));
關于中文顯示的問題:
這裡說明一下,由于我的Qt使用了VS2015作為編譯器,VS2015内部編碼根據使用區域預設為GBK,而Qt預設采用UTF-8編碼,是以在Qt Creator的代碼中的中文顯示胡出現亂碼,而.ui檔案使用XML,是以在.ui中編輯的中文均能正常顯示。修改中文亂碼的方法網上有很多,但我測試後最快捷有效的是這個方法:Qt技巧——中文顯示亂碼問題。
2、标準顔色對話框
同樣,直接添加槽函數:
void basedialog::on_colorButton_clicked()
{
QColor color = QColorDialog::getColor(Qt::yellow,this,QString::fromLocal8Bit("選擇顔色"),QColorDialog::ShowAlphaChannel);
ui->colorframe->setPalette(QPalette(color));
ui->colorframe->setAutoFillBackground(true);
}
這裡顯示顔色用的是QFrame,QFrame是widget的一個基類,可以友善地改變外形,這裡用它來擷取顔色接收參數并将背景色更改為對應顔色。
3、标準字型對話框
用法與上面相同,查詢文檔和函數原型便可知道用法。
void basedialog::on_fontButton_clicked()
{
bool ok;
QFont font = QFontDialog::getFont(&ok,QFont("Arial",12),this,QString::fromLocal8Bit("字型"));
if(ok)
ui->fontlineEdit->setFont(font);
}
4、标準輸入對話框
這裡需要在目前的對話框調用另一個對話框。方法可以參考前面的:Qt技巧——多視窗調用
進入子對話框inputdialog後,我們可以嘗試進行多種類型的輸入操作:
字元串、字元串多選清單、整數、double浮點數。以字元串輸入為例,先建立一個輸入對話框的執行個體,用getText()方法擷取輸入框的字元串,傳給變量newname,并用label顯示newname。
void InputDialog::on_nameButton_clicked()
{
bool ok;
nameInputDialog = new QInputDialog;
QString newname = nameInputDialog->getText(this,
QString::fromLocal8Bit("修改姓名"),
QString::fromLocal8Bit("名姓:"),
QLineEdit::Normal,
ui->namelabel2->text(),
&ok);
if(ok && !newname.isEmpty()){
ui->namelabel2->setText(newname);
}
}
至于getText()各參數的含義,可以F1查詢文檔,官方給出了詳細用法說明和示例。
其他輸入的操作類似,隻需重載資料擷取的方法即可:
void InputDialog::on_nameButton_clicked()
{
bool ok;
nameInputDialog = new QInputDialog;
QString newname = nameInputDialog->getText(this,
QString::fromLocal8Bit("修改姓名"),
QString::fromLocal8Bit("名姓:"),
QLineEdit::Normal,
ui->namelabel2->text(),
&ok);
if(ok && !newname.isEmpty()){
ui->namelabel2->setText(newname);
}
}
void InputDialog::on_sexButton_clicked()
{
bool ok;
QStringList SexItems;
SexItems<<QString::fromLocal8Bit("男")<<QString::fromLocal8Bit("女");
sexInputDialog = new QInputDialog;
QString SexItem = sexInputDialog->getItem(this,
QString::fromLocal8Bit("修改性别"),
QString::fromLocal8Bit("性别:"),
SexItems,0,false,
&ok);
if(ok && !SexItem.isEmpty()){
ui->sexlabel2->setText(SexItem);
}
}
void InputDialog::on_ageButton_clicked()
{
bool ok;
ageInputDialog = new QInputDialog;
int newage = ageInputDialog->getInt(this,
QString::fromLocal8Bit("修改年齡"),
QString::fromLocal8Bit("年齡:"),
22,-2147483647,2147483647,1,
&ok);
if(ok){
ui->agelabel2->setText(QString("%1").arg(newage));
}
}
void InputDialog::on_scoreButton_clicked()
{
bool ok;
scoreInputDialog = new QInputDialog;
double newscore = scoreInputDialog->getDouble(this,
QString::fromLocal8Bit("修改分數"),
QString::fromLocal8Bit("分數:"),
0,-2147483647,2147483647,1,
&ok);
if(ok){
ui->scorelabel2->setText(QString("%1").arg(newscore));
}
}
5、标準消息對話框
與标準輸入對話框一樣,需要建立一個子對話框。在标準消息對話框中,我們給出了5種對話框示例:question、information、warning、critical、about。
以question為例,我們調用了QMessageBox::question(),函數原型為:
StandardButton QMessageBox::question(QWidget *parent,
const QString &title,
const QString &text,
StandardButtons buttons = StandardButtons( Yes | No ),
StandardButton defaultButton = NoButton)
最後兩項分别設定對話框中的按鈕及預設已選按鈕,我這裡隻給了Ok和Cancel兩個按鈕,預設選擇Ok。然後用一個Switch分别對Ok和Cancel進行處理。我這裡是将其與一個Label綁定,點選不同按鈕顯示不同字元串。
void MsgDialog::on_qstMsgButton_clicked()
{
QMessageBox::StandardButton msgindex = QMessageBox::question(this,
QString::fromLocal8Bit("詢問"),
QString::fromLocal8Bit("修改完成,是否繼續?"),
QMessageBox::Ok|QMessageBox::Cancel,
QMessageBox::Ok);
switch (msgindex) {
case QMessageBox::Ok:
ui->msgLabel->setText("question msg:ok");
break;
case QMessageBox::Cancel:
ui->msgLabel->setText("question msg:cancel");
break;
default:
break;
}
}
同樣的,我們用類似方法設定其他對話框:
四、總結
Qt中基本标準對話框的使用相對來說還是很簡便的,大量現成的類和方法都可以直接拿來用,并且幫助文檔中已經給了詳細的說明和用例。最後上一張整體的圖吧: