Qt5开发学习之Qt基本对话框(四)

来源:互联网 发布:网络直播技术的意义 编辑:程序博客网 时间:2024/06/08 12:20
基本对话框包括标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框(QFontDialog)、标准输入对话框(QInputDialog)、消息对话框(QMessageBox)。

各种基本对话框由各自的静态函数来完成其功能:
QDialog函数
下面的实例,将各种对话框集合成一个项目进行试验。首先创建一个GUI项目,基类选择QDialog;然后在头文件包含<QTextCodec>;在main.cpp添加如下代码以便显示中文:QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
Dialog类用于显示整体的对话框,其中提供五个标准对话框功能
头文件 dialog.h

#include <QDialog>#include <QString>#include <QTextCodec>#include <QLabel>#include <QPushButton>#include <QLineEdit>#include <QGridLayout>#include <QFileDialog>#include <QColorDialog>#include <QFontDialog>#include "inputdlg.h"#include "msgboxdlg.h"class Dialog : public QDialog{    Q_OBJECTpublic:    Dialog(QWidget *parent = 0);    ~Dialog();private:    // 标准文件对话框    QPushButton *fileButton;    QLineEdit *fileEdit;    // 标准颜色对话框    QPushButton *colorButton;    QFrame *colorFrame;    // 标准字体对话框    QPushButton *fontButton;    QLineEdit *fontEdit;    // 标准输入对话框    QPushButton *inputButton;    InputDlg *inputDlg;    // 消息对话框    QPushButton *msgButton;    MsgBoxDlg *msgDlg;private slots:    // 文件对话框槽函数    void showFileDialog();    // 标准颜色对话框槽函数    void showColorDialog();    // 标准字体对话框槽函数    void showFontDialog();    // 弹出标准输入框的槽函数    void showInputDialog();    // 弹出消息对话框    void showMsgDlg();};

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent)    : QDialog(parent){    setWindowTitle(tr("对话框实例"));    this->resize(400, 400);    QGridLayout *mainLayout = new QGridLayout(this);    // 标准文件对话框控件、槽函数    fileButton = new QPushButton(tr("标准文件对话框"));    fileEdit = new QLineEdit;    mainLayout->addWidget(fileButton, 0, 0);    mainLayout->addWidget(fileEdit, 0, 1);    connect(fileButton, &QPushButton::clicked, this, &Dialog::showFileDialog);    // 标准颜色对话框控件、槽函数    colorButton = new QPushButton(tr("标准颜色对话框"));    // QFrame用于根据用户选择的不同的颜色更新的不同的背景    colorFrame = new QFrame;    colorFrame->setFrameShape(QFrame::Box);    colorFrame->setAutoFillBackground(true);    mainLayout->addWidget(colorButton, 1, 0);    mainLayout->addWidget(colorFrame, 1, 1);    connect(colorButton, &QPushButton::clicked, this, &Dialog::showColorDialog);    // 标准字体对话框控件、槽函数    fontButton = new QPushButton(tr("标准字体对话框"));    fontEdit = new QLineEdit;    fontEdit->setText(tr("Hello shige"));    mainLayout->addWidget(fontButton, 2, 0);    mainLayout->addWidget(fontEdit, 2, 1);    connect(fontButton, &QPushButton::clicked, this, &Dialog::showFontDialog);    // 标准输入框控件、槽函数    inputButton = new QPushButton(tr("标准输入对话框"));    mainLayout->addWidget(inputButton, 3, 0);    connect(inputButton, &QPushButton::clicked, this, &Dialog::showInputDialog);    // 消息框控件、槽函数    msgButton = new QPushButton(tr("标准消息对话框"));    mainLayout->addWidget(msgButton, 3, 1);    connect(msgButton, &QPushButton::clicked, this, &Dialog::showMsgDlg);}Dialog::~Dialog(){}void Dialog::showFileDialog(){    // 获取打开的文件对话框中选中的文件的名称,getOpenFileName()函数    QString s = QFileDialog::getOpenFileName(this, "open file dialog", "/");    // 将获取到的名称添加到编辑框中    fileEdit->setText(s);}void Dialog::showColorDialog(){    // 调用颜色对话框选择颜色,getColor()函数    QColor color = QColorDialog::getColor(Qt::red);    // 将在调色板选择的颜色放到背景板中    if (color.isValid())    {        colorFrame->setPalette((QPalette)color);    }}void Dialog::showFontDialog(){    bool ok;    // 调用getFont()函数,如果用户点击ok就改变字体    QFont f = QFontDialog::getFont(&ok);    if (ok)    {        fontEdit->setFont(f);    }}void Dialog::showInputDialog(){    inputDlg = new InputDlg(this);    inputDlg->show();}void Dialog::showMsgDlg(){    msgDlg = new MsgBoxDlg(this);    msgDlg->show();}

这里写图片描述


在项目中新建InputDlg类,用于实现各种标准输入框的功能:
inputdlg.h

#include <QDialog>#include <QLabel>#include <QLineEdit>#include <QPushButton>#include <QGridLayout>#include <QInputDialog>class InputDlg : public QDialog{    Q_OBJECTpublic:    explicit InputDlg(QDialog *parent = 0);private:    QLabel *nameLabel1;    QLabel *nameLabel2;    QPushButton *nameButton;    QLabel *sexLabel1;    QLabel *sexLabel2;    QPushButton *sexButton;    QLabel *ageLabel1;    QLabel *ageLabel2;    QPushButton *ageButton;    QLabel *scoreLabel1;    QLabel *scoreLabel2;    QPushButton *scoreButton;    QGridLayout *mainLayout;private slots:    void changeName();    void changeSex();    void changeAge();    void changeScore();};

inputdlg.cpp

#include "inputdlg.h"InputDlg::InputDlg(QDialog *parent) : QDialog(parent){    nameLabel1 = new QLabel(tr("name :"));    nameLabel2 = new QLabel(tr("twisted"));    nameLabel2->setFrameStyle(QFrame::Panel | QFrame::Sunken);    nameButton = new QPushButton(tr("change name"));    connect(nameButton, &QPushButton::clicked, this, &InputDlg::changeName);    sexLabel1 = new QLabel(tr("sex :"));    sexLabel2 = new QLabel(tr("man"));    sexLabel2->setFrameStyle(QFrame::Panel | QFrame::Sunken);    sexButton = new QPushButton(tr("change sex"));    connect(sexButton, &QPushButton::clicked, this, &InputDlg::changeSex);    ageLabel1 = new QLabel(tr("age :"));    ageLabel2 = new QLabel(tr("25"));    ageLabel2->setFrameStyle(QFrame::Panel | QFrame::Sunken);    ageButton = new QPushButton(tr("change age"));    connect(ageButton, &QPushButton::clicked, this, &InputDlg::changeAge);    scoreLabel1 = new QLabel(tr("score :"));    scoreLabel2 = new QLabel(tr("100"));    scoreLabel2->setFrameStyle(QFrame::Panel | QFrame::Sunken);    scoreButton = new QPushButton(tr("change score"));    connect(scoreButton, &QPushButton::clicked, this, &InputDlg::changeScore);    mainLayout = new QGridLayout(this);    mainLayout->addWidget(nameLabel1, 0, 0);    mainLayout->addWidget(nameLabel2, 0, 1);    mainLayout->addWidget(nameButton, 0, 2);    mainLayout->addWidget(sexLabel1, 1, 0);    mainLayout->addWidget(sexLabel2, 1, 1);    mainLayout->addWidget(sexButton, 1, 2);    mainLayout->addWidget(ageLabel1, 2, 0);    mainLayout->addWidget(ageLabel2, 2, 1);    mainLayout->addWidget(ageButton, 2, 2);    mainLayout->addWidget(scoreLabel1, 3, 0);    mainLayout->addWidget(scoreLabel2, 3, 1);    mainLayout->addWidget(scoreButton, 3, 2);}// 标准字符串输入框void InputDlg::changeName(){    // 字符串输入框由getText()函数来完成    bool ok;    QString name = QInputDialog::getText(this, tr("字符串输入框"), tr("plz input the name"), QLineEdit::Normal, nameLabel2->text(), &ok);    if (ok && !name.isEmpty())    {        nameLabel2->setText(name);    }}// 标准条目选择对话框void InputDlg::changeSex(){    // 条目选择对话框由getItem()函数来完成    // 下拉列表    QStringList sexItems;    sexItems << tr("man") << tr("women");    bool ok;    QString sex = QInputDialog::getItem(this, tr("条目选择框"), tr("plz select the sex"), sexItems, 0, false, &ok);    if (ok && !sex.isEmpty())    {        sexLabel2->setText(sex);    }}// 标准int类型输入框void InputDlg::changeAge(){    bool ok;    int age = QInputDialog::getInt(this, tr("整形输入框"), tr("plz intput the age"), ageLabel2->text().toInt(&ok), 0, 100, 1, &ok);    if (ok)    {        ageLabel2->setText(tr("%1").arg(age));    }}void InputDlg::changeScore(){    bool ok;    double score = QInputDialog::getDouble(this, tr("浮点型输入框"), tr("plz intput the score"), scoreLabel2->text().toDouble(&ok), 0, 100, 1, &ok);    if (ok)    {        scoreLabel2->setText(tr("%1").arg(score));    }}

这里写图片描述


新建MsgBoxDlg类,用于实现各种消息对话框的功能
消息对话框用于弹出各种各样的消息为用户提供提示与提醒,Qt提供了QMessageBox类来支持此项功能。
Question消息框为正常操作提供一个简单的询问,Information消息框为正常操作提供一个提示,Warning消息框提醒用户发生了一个错误,Critical消息框警告用户发生了一个严重错误。
msgboxdlg.h

#include <QDialog>#include <QLabel>#include <QPushButton>#include <QGridLayout>#include <QMessageBox>class MsgBoxDlg : public QDialog{    Q_OBJECTpublic:    explicit MsgBoxDlg(QDialog *parent = 0);private:    QLabel *label;    QPushButton *questionBtn;    QPushButton *informationBtn;    QPushButton *warningBtn;    QPushButton *criticalBtn;    QPushButton *aboutBtn;    QPushButton *aboutQtBtn;    QGridLayout *mainLayout;private slots:    void showQuestion();    void showInfomation();    void showWarning();    void showCritical();    void showAbout();    void showAboutQt();};

msgboxdlg.cpp

#include "msgboxdlg.h"MsgBoxDlg::MsgBoxDlg(QDialog *parent) : QDialog(parent){    setWindowTitle(tr("各种消息框"));    mainLayout = new QGridLayout(this);    label = new QLabel(tr("plz select a Msg"));    mainLayout->addWidget(label, 0, 0, 1, 2);    questionBtn = new QPushButton(tr("qusetion Msg"));    connect(questionBtn, &QPushButton::clicked, this, &MsgBoxDlg::showQuestion);    mainLayout->addWidget(questionBtn,1, 0);    informationBtn = new QPushButton(tr("information Msg"));    connect(informationBtn, &QPushButton::clicked, this, &MsgBoxDlg::showInfomation);    mainLayout->addWidget(informationBtn, 1, 1);    warningBtn = new QPushButton(tr("warning Msg"));    connect(warningBtn, &QPushButton::clicked, this, &MsgBoxDlg::showWarning);    mainLayout->addWidget(warningBtn, 2, 0);    criticalBtn = new QPushButton(tr("critical Msg"));    connect(criticalBtn, &QPushButton::clicked, this, &MsgBoxDlg::showCritical);    mainLayout->addWidget(criticalBtn, 2, 1);    aboutBtn = new QPushButton(tr("about Msg"));    connect(aboutBtn, &QPushButton::clicked, this, &MsgBoxDlg::showAbout);    mainLayout->addWidget(aboutBtn, 3, 0);    aboutQtBtn = new QPushButton(tr("aboutQt Msg"));    connect(aboutQtBtn, &QPushButton::clicked, this, &MsgBoxDlg::showAboutQt);    mainLayout->addWidget(aboutQtBtn, 3, 1);}void MsgBoxDlg::showQuestion(){    // 使用QMessageBox::question()函数完成    label->setText(tr("Question Msg Box"));    switch (QMessageBox::question(this, tr("question Msg"), tr("question has over, did ok?"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok))    {    case QMessageBox::Ok:        label->setText(tr("OK"));        break;    case QMessageBox::Cancel:        label->setText(tr("CANCEL"));        break;    default:        break;    }    return;}void MsgBoxDlg::showInfomation(){    // 使用QMessageBox::information()函数完成    label->setText(tr("Information Msg Box"));    QMessageBox::information(this, tr("information Msg"), tr("this is a information"));    return;}void MsgBoxDlg::showWarning(){    // 使用QMessageBox::warning()函数完成    label->setText(tr("Warning Msg Box"));    switch ( QMessageBox::warning(this, tr("warning Msg"), tr("do you want to save?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save))    {    case QMessageBox::Save:        label->setText(tr("SAVE"));        break;    case QMessageBox::Discard:        label->setText(tr("discard"));        break;    case QMessageBox::Cancel:        label->setText(tr("CANCEL"));        break;    default:        break;    }    return;}void MsgBoxDlg::showCritical(){    // 使用QMessageBox::cirtical()函数完成,有错误时使用    label->setText(tr("Critical Msg Box"));    QMessageBox::critical(this, tr("critical Msg"), tr("this is a critical box"));    return;}void MsgBoxDlg::showAbout(){    // 使用QMessageBox::about()函数完成    label->setText(tr("About Msg Box"));    QMessageBox::about(this, tr("about Msg"), tr("this is a about box"));    return;}void MsgBoxDlg::showAboutQt(){    // 使用QMessageBox::aboutQt()函数完成    label->setText(tr("AboutQt Msg Box"));    QMessageBox::aboutQt(this, tr("aboutQt Msg"));    return;}

这里写图片描述