Qt学习09——基本标准对话框

来源:互联网 发布:python应用领域 编辑:程序博客网 时间:2024/05/20 04:14

一、概述

本文用一个例子讲述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中基本标准对话框的使用相对来说还是很简便的,大量现成的类和方法都可以直接拿来用,并且帮助文档中已经给了详细的说明和用例。最后上一张整体的图吧:



原创粉丝点击