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

版权声明:欢迎转载和收藏。转载请注明出处,谢谢! https://blog.csdn.net/u014266675/article/details/73639538

一、概述

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



猜你喜欢

转载自blog.csdn.net/u014266675/article/details/73639538