基本对话框包括标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框(QFontDialog)、标准输入对话框(QInputDialog)、消息对话框(QMessageBox)。
各种基本对话框由各自的静态函数来完成其功能:
下面的实例,将各种对话框集合成一个项目进行试验。首先创建一个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_OBJECT
public:
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_OBJECT
public:
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_OBJECT
public:
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;
}