Qt的5种对话框使用详解
对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。所谓标准对话框,是Qt内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同。
Qt常用的内置对话框有QFileDialog、QColorDialog、QFontDialog、QInputDialog和QMessageBox。下面对这些对话框做一些简单示例。
| 对话框类 |
说明 |
静态函数 |
函数说明 |
| QFileDialog |
文件对话框 |
getOpenFileName() |
选择打开一个文件 |
|
|
getOpenFileNames() |
选择打开多个文件 |
|
|
getSaveFileName() |
选择保存一个文件 |
|
|
getExistingDirectory() |
选择一个已有的目录 |
|
|
getOpenFileUrl() |
选择打开一个文件,可选择远程网络文件 |
| QColorDialog |
颜色对话框 |
getColor() |
选择颜色 |
| QFontDialog |
字体对话框 |
QFontgetFont() |
选择字体 |
| QInputDialog |
输入对话框 |
getText() |
输入单行文字 |
|
|
getInt() |
输入整数 |
|
|
getDouble() |
输入浮点数 |
|
|
getItem() |
从一个下拉列表框中选择输入 |
|
|
getMultiLineText() |
输入多行字符串 |
| QMessageBox |
消息框 |
information() |
信息提示对话框 |
|
|
question() |
询问并获取是否确认的对话框 |
|
|
waming() |
警告信息对话框 |
|
|
critical() |
错误信息提示对话框 |
|
|
about() |
设置自定义信息的关于对话框 |
|
|
aboutQt() |
关于Qt的对话框 |
|
|
|
|
1 QFileDialog文件对话框
文件对话框可以通过调用QFileDialog::getOpenFileName方法实现,方法的第一个参数指定窗体的父窗体,第二个参数指定窗体的标题,第三个参数指定窗体的打开目录,第四个参数用于限定打开的文件类型,有多个类型时中间用;;隔开。下面程序演示了当用户点击按钮后会弹出文件对话框,之后将用户选择的文件路径显示在文本框中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void Dialog::ShowFileDlg() { QString sPath = QFileDialog::getOpenFileName( this, "标准文件对话框", ".", "C++ files(*.cpp);;" "C files(*.c);;" "Header files(*.h)" ); m_fileEdit->setText(sPath); }
|

2 QColorDialog颜色对话框
颜色对话框可以通过调用QColorDialog::getColor方法实现,方法的第一个参数表示默认选择的颜色。该方法会返回一个颜色类。
1 2 3 4 5 6 7 8 9 10 11
| void Dialog::ShowColorDlg() { QColor color = QColorDialog::getColor( Qt::yellow ); if(color.isValid()){ m_colorFrame->setPalette(QPalette(color)); } }
|

3 QFontDialog字体对话框
字体对话框可以通过调用QFontDialog::getFont方法实现,该方法需要传入一个bool类型的参数用来接收函数是否成功执行,方法会返回一个字体类。
1 2 3 4 5 6 7 8 9 10 11 12
| void Dialog::ShowFontDlg() { bool ok; QFont font = QFontDialog::getFont( &ok ); if(ok){ m_fontEdit->setFont(font); } }
|


设置姓名,可以调用的是QInputDialog::getText()方法来获取输入的单行文本。方法的第一个参数指定父窗体,第二个参数指定对话框的标题,第三个参数指定对话框显示的内容,第四个参数指定输入框的模式,第五个参数指定默认值,第六个参数是一个bool类型用来接收函数是否执行成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void InputDlg::editName() { bool ok; QString strName = QInputDialog::getText( this, "标准文本输入对话框", "请编辑姓名", QLineEdit::Normal, m_nameLabel->text(), &ok ); if(ok && !strName.isEmpty()){ m_nameLabel->setText(strName); } }
|
设置性别,可以调用的是QInputDialog::getItem( ) 方法用来获取用户从下拉列表选择的值。QInputDialog第三个参数用来设置下拉列表框,要传入一个QStringList类型的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void InputDlg::editSex() { QStringList sexList; bool ok; sexList<<"男"<<"女"<<"未知"; QString strSex = QInputDialog::getItem( this, "标准条目输入对话框", "请选择性别", sexList, 0, false, &ok ); if(ok && !strSex.isEmpty()){ m_sexLabel->setText(strSex); } }
|
设置年龄,可以调用QInputDialog::getInt方法用来获取用户填入的整数值。getInt方法的第四个参数和第五个参数分别用来设置整数的最小值和最大值,第六个参数用来设置步长,即点击增加按钮时每次增加的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void InputDlg::editAge(){ bool ok; int age = QInputDialog::getInt( this, "标注int数据类型输入对话框", "请编辑年龄", m_ageLabel->text().toInt(), 0, 120, 1, &ok ); if(ok){ m_ageLabel->setText(QString("%1").arg(age)); } }
|
设置分数,可以调用QInputDialog::getDouble方法用来获取用户填入的浮点数值。getDouble方法的第四个参数和第五个参数分别用来设置整数的最小值和最大值,第六个参数用来设置精度,即点数据的小数位。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void InputDlg::editScore() { bool ok; double score = QInputDialog::getDouble( this, "标准double数据类型输入对话框", "请编辑分数", m_scoreLabel->text().toDouble(), 0, 100, 1, &ok ); if(ok){ m_scoreLabel->setText(QString::number(score)); } }
|
5 QMessageBox消息框

问题消息框,可以调用QMessageBox::question() 显示问题消息框,问题消息框可设置要显示的按钮,方法会返回一个枚举类型表示用户所点击的按钮。这里设置的是“确定”和“取消”按钮。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void MsgBoxDlg::showQuestionMsgDlg() { m_tipLabel->setText("问题消息框"); int res = QMessageBox::question( this, "问题消息框", "已打开问题消息框,是否关闭?", QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Ok ); switch (res) { case QMessageBox::Ok: m_tipLabel->setText("问题消息框 - 确定"); break; case QMessageBox::Cancel: m_tipLabel->setText("问题消息框 - 取消"); break; default: break; } }
|
信息消息框,可以调用QMessageBox::information( )方法实现,信息消息框的作用是给用户展示一段消息,无需用户做出操作,函数参数也比较简单。
1 2 3 4 5 6 7 8
| void MsgBoxDlg::showInformationMsgDlg() { m_tipLabel->setText("信息消息框"); QMessageBox::information( this, "信息提示框", "这是个信息提示框" ); }
|
警告消息框,可以调用QMessageBox::waring方法,警告消息框同样可以设置消息框的按钮,方法会一个枚举类型表示用户的操作。这里设置的是“保存”、“忽视”和“取消”按钮。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| void MsgBoxDlg::showWarningMsgDlg() { m_tipLabel->setText("警告消息框"); int res = QMessageBox::warning( this, "警告消息框", "有为保存的文件", QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel, QMessageBox::Save ); switch (res) { case QMessageBox::Save: m_tipLabel->setText("警告提示框 - 保存"); break; case QMessageBox::Discard: m_tipLabel->setText("警告提示框 - 忽视"); break; case QMessageBox::Cancel: m_tipLabel->setText("警告提示框 - 取消"); break; default: break; } }
|
错误消息框,可以调用QMessageBox::critical方法,错误消息框也相当于一种消息提醒,会比信息消息框的效果显目,调用方法和信息消息框类似。
1 2 3 4 5 6 7 8
| void MsgBoxDlg::showCriticalMsgDlg() { m_tipLabel->setText("错误消息框"); QMessageBox::critical( this, "错误消息框", "发生重大错误!!" ); }
|
关于消息框,调用QMessageBox::about方法,关于消息框也是一种消息提醒,调用方法与信息消息框类似。
1 2 3 4 5 6 7 8
| void MsgBoxDlg::showAboutMsgDlg() { m_tipLabel->setText("关于消息框"); QMessageBox::about( this, "关于消息框", "这是个关于休斯顿的信息" ); }
|
关于QT消息框,调用QMessageBox::aboutQt方法,关于QT消息框会弹出一个有关QT的信息。其他功能暂无。
1 2 3 4 5 6 7
| void MsgBoxDlg::showAboutQtMsgDlg() { m_tipLabel->setText("关于QT消息框"); QMessageBox::aboutQt( this, "关于QT消息框" ); }
|
6 自定义消息框
自定义消息框设置了一个图标和三个按钮,其中两个按钮采用自定义形式,另一个按钮采用标准形式,当用户点击按钮后,从对话框中获取用户点击的按钮,然后显示出对应的文本。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| void Dialog::ShowCustomDlg() { m_customLabel->setText("自定义消息框"); QMessageBox customMsgBox; customMsgBox.setWindowTitle("自定义消息框"); QPushButton *yes = customMsgBox.addButton( "真的吗?", QMessageBox::ActionRole ); QPushButton *no = customMsgBox.addButton( "假的", QMessageBox::ActionRole ); QPushButton *cancel = customMsgBox.addButton( QMessageBox::Cancel); customMsgBox.setIconPixmap(QPixmap("msg.jpg")); customMsgBox.exec(); if(customMsgBox.clickedButton()==yes){ m_customLabel->setText("点了“真的吗?”"); }else if(customMsgBox.clickedButton()==no){ m_customLabel->setText("点了“假的 ”"); }else if(customMsgBox.clickedButton()==cancel){ m_customLabel->setText("点了“取消”"); } }
|