一、概述
本文用一个例子讲述Qt几种基本对话框的使用,包括QDialog、QFileDialog、QColorDialog、QFontDialog、QInputDialog、QMessageBox这几种。中间还会讲到如何实现ui的互相调用、中文显示问题等。
源码下载:
二、功能描述
先来看一下我们要实现哪些功能:
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中基本标准对话框的使用相对来说还是很简便的,大量现成的类和方法都可以直接拿来用,并且帮助文档中已经给了详细的说明和用例。最后上一张整体的图吧: