Qt 对话框
-
扩展性(“更多”选项)
setExtension()
setOrientation()
showExtension() -
默认按钮(回车键时被按下的按钮)
QPushButton::setDefault()
QPushButton::isDefault()
QPushButton::autonDefault() -
setSizeGripEnabled()函数
设置是否能拖拽右下角图标(QSizeGrip对象)控制界面大小。 -
构造函数
QDialog(
QWidget *parent = 0,
const char *name = 0,
bool model = FALSE,
WFlag f = 0
);
非模态,show()显示。
模态,exec()显示,会阻塞其他窗口输入。
model为true ,show()显示,半模态参数f指定对话框风格。
比如去掉“这是什么”按钮,
设置f = WSyle_Customize|WSyle_NormalBorder|WStyle_Title|WStyle_SysMenu。
- DialogCode
enum DialogCode{Rejected, Accepted};
表示模态对话框返回值。
- result()函数
int result() const;
获得模态对话框的结果代码,返回值取Rejected或Accepted。
WDestructiveClose标记构造的对话框不调用这个函数。
- show()函数
virtual void show();
显示非模态或半模态对话框。对话框无本地事件循环,需定时调用QApplication::processEvents()处理事件。
- setOrientation()函数
void setOrientation(Orientation orientation);
设置对话框扩展方向,Horizontal,Vertical。
- orientation()函数
void orientation() const;
返回对话框的扩展方向。
- setExtension()函数
void setExtension(QWidget *extension);
设置extension为对话框的扩展,删除任何以前的扩展。对话框隐藏时,才能调用。
- extension()函数
QWidget * extension() const;
获得扩展
- setSizeGripEnabled()函数
void setSizeGripEnabled(bool);
设置调整对话框大小的控件是否生效
- isSizeGripEnabled()函数
bool isSizeGripEnabled() const;
调整对话框大小的控件是否生效。
- exec()函数
void exec();
执行模块对话框。
- show()函数
void show();
执行非模块或半模态对话框。
- setResult()函数
void setResult(int i);
设置模态对话框的结果代码为i。
- 保护槽
(1)done()函数
virtual void done(int r);
隐藏模态对话框,并将结果代码设置为r。exec()函数返回的就是结果代码r。
若对话框设置WDestructiveClose,done()函数会销毁对话框。
(2)accept()函数
virtual void accept();
隐藏模态对话框,并将结果代码设置为Accepted。
(3)reject()函数
virtual void reject();
隐藏模态对话框,并将结果代码设置为Rejected。
(4)showExtension()函数
void showExtension(bool);
对话框无扩展或不可见,无反应。
true显示扩展部分,false隐藏。这个槽常被连接到QPushButton的QButton::toggled()信号。
- 对话框属性
void setWindowTitle(const QString &);
void QWidget::setMinimumSize(int minw, int minh);
void QWidget::setMaxmumSize(int minw, int minh);
resize();
setWindowIcon(QIcon(“tool.ico”));
setStyleSheet(“background-image:url(gza.jpg);border:1px solid black;”);
坐标系统
- 边框(Frame)
上下左右宽度相同,鼠标放上边框并按住鼠标拖放可以调整窗口大小,setWindowFlags(Qt::FramelessWindowHint)去掉边框,setStyleSheet(“background:transparent;border:2px solid red;”)设置边框。 - 标题栏(Windows Title)
系统定义,无法更改,setWindowFlags (Qt::CustomizeWindowHint)或setWindowFlags (Qt::FramelessWindowHint)去掉标题栏。 - 客户区(用户区,Client Area)。
从左向右为X正向,从上往下为Y正向。
(1)x()、y()获得窗口左上角在屏幕中坐标,width()、height()获得客户区的宽和高。
(2)geometry():x()、y()获得客户区左上角在屏幕中坐标,width()、height()获得客户区的宽和高。
(3)frameGeometry():x()、y()获得窗口左上角在屏幕中坐标,width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽和高。
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget w;
QPushButton b(&w);
b.setText("Button");
b.resize(100, 40);
b.move(20, 20);
w.resize(800, 500);
w.move(10, 10);
w.show();
return a.exec();
}
模态与非模态对话框
exec()显示模态对话框,锁住程序直到用户关闭该对话框为止。new创建和调用show()也可以创建模态对话框,在前面调用setModa()函数。
myModalDialog mydlg;
mydlg.exec();
myModalDialog *mydlg = new myModalDialog(this);
mydlg->setModal(true);
mydlg->show()
对话框可以通过调用accept()或reject()槽函数来关闭,并且exec()将返回对应的Accepted或Rejected。若窗口未被销毁,结果可以通过result()得到。若设置了WDestructiveClose标记,exec()返回时对话框会被删除。
去除标题栏和边框
Widget(parent, Qt::WDestructiveClose | Qt::WStyle_Customize | Qt::WStyle_NoBorder);
"半模态"对话框,立即将控制权返回给调用者的模态对话框,没有自己的事件循环,需要周期性地调用QApplication::processEvents()来让"半模态"对话框处理自己事件的机会。例如进度条对话框QProgressDialog,它可以让用户有机会终止一个正在运行的操作。通常模态标记为true,并调用show()。
myModalDialog mydlg;
int res = mydlg.exec();
if(res==QDialog:::Accepted)
QMessageBox::about(this, "Note", "ok");
if(res==QDialog:::Rejected)
QMessageBox::about(this, "Note", "cancel");
通用对话框
消息对话框
#include <QMessageBox>
询问(Question)消息框
向用户提出问题,是和否,继续、终止和重新开始,问号。
QMessageBox::StandardButton QMessageBox::question(
QWidget *parent,
const QString &title,
const QSteing &text,
QMessageBox::StandardButton buttons = StandardButtons(Yes | No),
QMessageBox::StandardButton defaultButton = NoButton
);
label->setText(tr("Question Message Box"));
switch(QMessageBox::question(
this,
tr("Question消息框"),
tr("您现在已经修改完成,是否要结束程序?"),
QMessageBox::Ok|QMessageBox::Cancel,
QMessageBox::Ok
)) {
case QMessageBox::Ok:
label->setText("Question button/Ok");
break;
case QMessageBox::Cancel:
label->setText("Question button/Cancel");
break;
default:
break;
}
信息(Information)消息框
显示一段文本,确定,感叹号。
QMessageBox::StandardButton QMessageBox::information(
QWidget *parent,
const QString &title,
const QSteing &text,
QMessageBox::StandardButton buttons,
QMessageBox::StandardButton defaultButton = NoButton
);
label->setText(tr("Information Message Box"));
QMessageBox::information(
this,
tr("Information消息框"),
tr("这是Information消息框测试,欢迎您!")
);
警告(Warning)消息框
告诉用户发生错误。
QMessageBox::StandardButton QMessageBox::warning(
QWidget *parent,
const QString &title,
const QSteing &text,
QMessageBox::StandardButton buttons = Ok,
QMessageBox::StandardButton defaultButton = NoButton
);
label->setText(tr("Warning Message Box"));
switch(QMessageBox::warning(
this,
tr("Warning消息框"),
tr("您修改的内容还未保存,是否要保存对文档的修改?"),
QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel,
QMessageBox::Save
)) {
case QMessageBox::Save:
label->setText(tr("Warning button/Save"));
break;
case QMessageBox::Discard:
label->setText(tr("Warning button/Discard"));
break;
case QMessageBox::Cancel:
label->setText(tr("Warning button/Cancel"));
break;
default:
break;
}
紧急(Critical)消息框
告诉用户发生严重错误,打叉的圆形图标。
QMessageBox::StandardButton QMessageBox::critical(
QWidget *parent,
const QString &title,
const QString &text,
QMessageBox::StandardButton buttons = Ok,
QMessageBox::StandardButton defaultButton = NoButton
);
label->setText(tr("Critical Message Box"));
QMessageBox::critical(
this,
tr("Critical消息框"),
tr("这是一个Critical消息框测试!")
);
关于(About)消息框
显示本软件的版权号及版本相关的内容。
void QMessageBox::about(
QWidget *parent,
const QString &title,
const QSteing &text
);
QMessageBox::about(
this,
tr("About消息框"),
"visit:<a href='http://qq.com'><font color='red'>qq.com</font></a>"
);
关于(About Qt)消息框
显示Qt的版权号及版本相关的内容。
void QMessageBox::aboutQt(
QWidget *parent,
const QString &title = QString()
);
label->setText(tr("About Qt Message Box"));
QMessageBox::aboutQt(
this,
tr("About Qt消息框")
);
自定义(Custom)消息框
QMessageBox::Ok
QMessageBox::Cancel
QMessageBox::Yes
QMessageBox::No
QMessageBox::Abort
QMessageBox::Retry
QMessageBox::Ignore
enum StandardButton {
NoButton = 0x00000000,
Ok = 0x00000400,
Save = 0x00000800,
SaveAll = 0x00001000,
Open = 0x00002000,
Yes = 0x00004000,
YesToAll = 0x00008000,
No = 0x00010000,
NoToAll = 0x00020000,
Abort = 0x00040000,
Retry = 0x00080000,
Ignore = 0x00100000,
...
}
enum Icon {
NoIcon = 0,
Information = 1,
Warning = 2,
Critical = 3,
Question = 4,
};
QMessageBox::StandardButton rt;
rt = QMessageBox::question(
this,
"note",
"hello",
QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore
);
if(QMessageBox::Abort == rt)
QMessageBox::information(this, "note", "you selected Abort");
else if(QMessageBox::Retry == rt)
QMessageBox::information(this, "note", "you selected Retry");
else
QMessageBox::information(this, "note", "you selected Ignore");
QMessageBox message(QMessageBox::NoIcon, "Title", "gza bridge");
message.setIconPixmap(QPixmap("d:\\gza.jpg"));
message.exec();
QMessageBox dlg(this);
dlg.setWindowTitle(QString::fromLocal8Bit("我的标题"));
dlg.setText(QString::fromLocal8Bit("这是一段消息。"));
//dlg.setIcon(QMessageBox::NoIcon);
dlg.setIconPixmap(QPixmap("d:\\gza.jpg"));
QPushButton *yesBtn = dlg.addButton(tr("Yes"), QMessageBox::ActionRole);
QPushButton *noBtn = dlg.addButton(tr("No"), QMessageBox::ActionRole);
QPushButton *cancelBtn = dlg.addButton(QMessageBox::Cancel);
dlg.exec();
if(dlg.clickedButton() == yesBtn) {
label->setText("Custom Message Box/Yes");
} else if(dlg.clickedButton() == noBtn) {
label->setText("Custom Message Box/No");
} else if(dlg.clickedButton() == cancelBtn) {
label->setText("Custom Message Box/Cancel");
}
//本地字符集GB到Unicode的转换
//Windows默认编码GBK/GB2312/GB18030
//Qt默认编码Unicode
#define z(s) (QString::fromLocal8Bit(s))
QMessageBox dlg(this);
dlg.setWindowTitle("my title");
dlg.setText(z("你是学生吗?"));
dlg.setStandardButtons(QMessagBox::Yes|QMessageBox::No);
dlg.setDefaultButton(QMessageBox::Yes);
dlg.setIcon(QMessageBox::Question);
int ret = dlg.exec();
switch(ret) {
case QMessageBox::Yes:
QMessageBox::information(this, NULL, z("你好,学生"));
break;
case QMessageBox::No:
QMessageBox::information(this, NULL, z("你好,职场人士"));
break;
}
文件对话框
#include <QFileDialog>
QString getOpenFileName()
QStringList getOpenFileNames()
QString getSaveFileName()
QString getExistingDirectory()
QUrl getOpenFileUrl()
打开单个文件对话框
QString QFileDialog::getOpenFileName(
QWidgt *parent = nullptr,
//标题名
const QString &caption = QString(),
//默认目录,若带有文件名,则是默认选中文件
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
//默认同时显示目录与文件名
Options = 0
);
QString fileName = QFileDialog::getOpenFileName(
this,
"Open Image",
".",
"Image Files(*.jpg *.png)"
);
if(!fileName.empty())
QMessageBox::information(this, "caption", fileName);
打开多个文件对话框
QStringList QFileDialog::getOpenFileNames(
QWidgt *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
QFileDialog::Options = ...
);
QStringList fileNames = QFileDialog::getOpenFileNames(
this,
tr("选择转码文件"),
"d:",
tr("视频文件(*.mp4 *.m3u8);;所有文件(*.*);;")
);
for(int i=0; i<fileNames.size(); i++) {
QMessageBox::information(this, "caption", fileNames[i]);
}
保存文件对话框
QStringList QFileDialog::getSaveFileName(
QWidgt *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
QFileDialog::Options = ...
);
QString fileName = QFileDialog::getSaveFileName(
this,
"Save Image",
".",
"Image Files(*.jpg *.png)"
);
QMessageBox::information(this, "caption", fileName);
保存文件目录对话框
getExistingDirectory
实例
QString fuile_full, file_name, file_path, file_ext;
QFileInfo fi;
fuile_full = QFileDialog::getOpenFileName(
this,
NULL,
"d:\\",
NULL
);
if(fuile_full!="") {
QMessageBox::information(this, "caption", fuile_full);
fi = QFileInfo(fuile_full);
file_name = fi.fileName();
file_path = fi.absolutePath();
file_ext = fi.suffix();
}
#define z(s) (QString::fromLocal8Bit(s))
//文件打开对话框
QFileDialog dlg(
this,
NULL,
NULL,
z("文本文件(*.txt);;所有文件(*.*);;")
);
//设置初始路径
dlg.setDirectory("d:\\");
//选择多个文件
dlg.setFileMode(QFileDialog::ExistingFiles);
//文件保存对话框
dlg.setAcceptMode(QFileDialog::AcceptSave);
if(dlg.exec() == QFileDialog::Accepted) {
QStringList files = dlg.selectedFiles();
QString file = files[0];
QMessageBox::information(this, "caption", file);
}
字体对话框
#include <QFontDialog>
QFont QFontDialog::getFont(
bool *ok,
const QFont &initial,
QWidget *parent = nullptr,
const QString &title = QString(),
QFontDialog::FontDialogOptions options = ...
);
QFont QFontDialog::getFont(
bool *ok,
QWidget *parent = nullptr
);
bool ok;
QFont font = QFontDialog::getFont(
&ok,
QFont("Courier New", 10, QFont::Bold)
);
if(ok) {
QMessageBox::information(this, "Note", "ok");
} else {
QMessageBox::information(this, "Note", "cancel");
}
QFontDialog dlg(this);
dlg.setWindowTitle("my font dialog");
dlg.setCurrentFont(QFont("Courier New", 10, QFont::Bold));
if(dlg.exec() == QColorDialog::Accepted) {
QFont font = dlg.selectedFont();
}
颜色对话框
#include <QColorDialog>
QColor QColorDialog::getColor(
const QColor &initial = Qt::white,
QWidget *parent = nullptr,
const QString &title = QString(),
QColorDialog::ColorDialogOptions options = ...
);
QColor color = QColorDialog::getColor(
Qt::green,
this,
"my color dialog",
QColorDialog::ShowAlphaChannel
);
if(color.isValid()) {
QMessageBox::information(this, "Note", "ok");
} else {
QMessageBox::information(this, "Note", "cancel");
}
QString str;
QColorDialog dlg(this);
dlg.setWindowTitle("my color dialog");
if(dlg.exec() == QColorDialog::Accepted) {
QColor color = dlg.selectedColor();
str.sprintf("rgb=(%d, %d, %d)", color.red(), color.green(), color.blue());
QMessageBox::information(this, "Note", str);
}
输入对话框
#include <QInputDialog>
QString getText()
int getInt()
double getDouble()
QString getItem()
QString getMultiLineText()
字符串输入对话框
static QString QInputDialog::getText(
QWidget *parent,
const QString &title,
const QString &label,
QLineEdit::EchoMode echo = QLineEdit::Normal,
const QString &text = QString(),
bool *ok = nullptr,
Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone
);
下拉表条目输入对话框
static QString QInputDialog::getItem(
QWidget *parent,
const QString &title,
const QString &label,
const QStringList &items,
int current = 0,
bool editable = true,
bool *ok = nullptr,
Qt::WindowFlags flags = Qt::WindowFlags(),
Qt::InputMethodHints inputMethodHints = Qt::ImhNone
);
int类型数据输入对话框
static int QInputDialog::getInt(
QWidget *parent,
const QString &title,
const QString &label,
int value = 0,
int minValue = -2147483647,
int maxValue = 2147483647,
int step = 1,
bool *ok = nullptr,
Qt::WindowFlags flags = Qt::WindowFlags()
);
double类型数据输入对话框
static double QInputDialog::getDouble(
QWidget *parent,
const QString &title,
const QString &label,
double value = 0,
double minValue = -2147483647,
double maxValue = 2147483647,
int decimals = 1,
bool *ok = nullptr,
Qt::WindowFlags flags = Qt::WindowFlags()
);
通用对话框实例1
DialogExample.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = DialogExample
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp \
dialog.cpp \
inputdlg.cpp \
msgboxdlg.cpp
HEADERS += dialog.h \
inputdlg.h \
msgboxdlg.h
main.cpp
#include "dialog.h"
#include <QApplication>
//#include <QTextCodec>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
//QTextCodec::setCodecForLocale(setCodecForTr(QTextCodec::codecForLocale());
Dialog w;
w.show();
return a.exec();
}
inputdlg.h
#ifndef INPUTDLG_H
#define INPUTDLG_H
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QDialog>
class InputDlg : public QDialog {
Q_OBJECT
public:
explicit InputDlg(QWidget* parent=0);
private slots:
void ChangeName();
void ChangeSex();
void ChangeAge();
void ChangeScore();
private:
QLabel *nameLabel1;
QLabel *nameLabel2;
QPushButton *nameBtn;
QLabel *sexLabel1;
QLabel *sexLabel2;
QPushButton *sexBtn;
QLabel *ageLabel1;
QLabel *ageLabel2;
QPushButton *ageBtn;
QLabel *scoreLabel1;
QLabel *scoreLabel2;
QPushButton *scoreBtn;
QGridLayout *mainLayout;
};
#endif // INPUTDLG_H
inputdlg.cpp
#include "inputdlg.h"
#include <QInputDialog>
InputDlg::InputDlg(QWidget* parent):QDialog(parent) {
setWindowTitle(tr("标准输入对话框实例"));
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
nameLabel1 = new QLabel(tr("姓名:"));
nameLabel2 = new QLabel(tr("周何骏"));
nameLabel2->setFrameStyle(QFrame::Panel|QFrame::Sunken);
nameBtn = new QPushButton(tr("修改姓名"));
sexLabel1 = new QLabel(tr("性别:"));
sexLabel2 = new QLabel(tr("男"));
sexLabel2->setFrameStyle(QFrame::Panel|QFrame::Sunken);
sexBtn = new QPushButton(tr("修改性别"));
ageLabel1 = new QLabel(tr("年龄:"));
ageLabel2 = new QLabel(tr("21"));
ageLabel2->setFrameStyle(QFrame::Panel|QFrame::Sunken);
ageBtn = new QPushButton(tr("修改年龄"));
scoreLabel1 = new QLabel(tr("成绩:"));
scoreLabel2 = new QLabel(tr("80"));
scoreLabel2->setFrameStyle(QFrame::Panel|QFrame::Sunken);
scoreBtn = new QPushButton(tr("修改成绩"));
mainLayout = new QGridLayout(this);
mainLayout->addWidget(nameLabel1, 0, 0);
mainLayout->addWidget(nameLabel2, 0, 1);
mainLayout->addWidget(nameBtn, 0, 2);
mainLayout->addWidget(sexLabel1, 1, 0);
mainLayout->addWidget(sexLabel2, 1, 1);
mainLayout->addWidget(sexBtn, 1, 2);
mainLayout->addWidget(ageLabel1, 2, 0);
mainLayout->addWidget(ageLabel2, 2, 1);
mainLayout->addWidget(ageBtn, 2, 2);
mainLayout->addWidget(scoreLabel1, 3, 0);
mainLayout->addWidget(scoreLabel2, 3, 1);
mainLayout->addWidget(scoreBtn, 3, 2);
mainLayout->setMargin(15);
mainLayout->setSpacing(10);
connect(nameBtn, SIGNAL(clicked()), this, SLOT(ChangeName()));
connect(sexBtn, SIGNAL(clicked()), this, SLOT(ChangeSex()));
connect(ageBtn, SIGNAL(clicked()), this, SLOT(ChangeAge()));
connect(scoreBtn, SIGNAL(clicked()), this, SLOT(ChangeScore()));
}
void InputDlg::ChangeName() {
bool ok;
QString text = QInputDialog::getText(
this,
tr("标准字符串输入对话框"),
tr("请输入姓名:"),
QLineEdit::Normal,
nameLabel2->text(),
&ok
);
if (ok && !text.isEmpty())
nameLabel2->setText(text);
}
void InputDlg::ChangeSex() {
QStringList SexItems = {tr("男"), tr("女")};
bool ok;
QString SexItem = QInputDialog::getItem(
this,
tr("标准条目选择对话框"),
tr("请选择性别:"),
SexItems,
0,
false,
&ok
);
if (ok && !SexItem.isEmpty())
sexLabel2->setText(SexItem);
}
void InputDlg::ChangeAge() {
bool ok;
int age = QInputDialog::getInt(
this,
tr("标准int类型输入对话框"),
tr("请输入年龄:"),
ageLabel2->text().toInt(&ok),
0,
100,
1,
&ok
);
if (ok)
ageLabel2->setText(QString(tr("%1")).arg(age));
}
void InputDlg::ChangeScore() {
bool ok;
double score = QInputDialog::getDouble(
this,
tr("标准double类型输入对话框"),
tr("请输入成绩:"),
scoreLabel2->text().toDouble(&ok),
0,
100,
1,
&ok
);
if (ok)
scoreLabel2->setText(QString(tr("%1")).arg(score));
}
msgboxdlg.h
#ifndef MSGBOXDLG_H
#define MSGBOXDLG_H
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QDialog>
class MsgBoxDlg : public QDialog {
Q_OBJECT
public:
explicit MsgBoxDlg(QWidget* parent=0);
private slots:
void showQuestionMsg();
void showInformationMsg();
void showWarningMsg();
void showCriticalMsg();
void showAboutMsg();
void showAboutQtMsg();
private:
QLabel *label;
QPushButton *questionBtn;
QPushButton *informationBtn;
QPushButton *warningBtn;
QPushButton *criticalBtn;
QPushButton *aboutBtn;
QPushButton *aboutQtBtn;
QGridLayout *mainLayout;
};
#endif
msgboxdlg.cpp
#include "msgboxdlg.h"
#include <QMessageBox>
MsgBoxDlg::MsgBoxDlg(QWidget *parent):QDialog(parent) {
setWindowTitle(tr("标准消息对话框实例"));
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
label = new QLabel(tr("请选择一种消息框"));
questionBtn = new QPushButton(tr("QuestionMsg"));
informationBtn = new QPushButton(tr("InformationMsg"));
warningBtn = new QPushButton(tr("WarningMsg"));
criticalBtn = new QPushButton(tr("CriticalMsg"));
aboutBtn = new QPushButton(tr("AboutMsg"));
aboutQtBtn = new QPushButton(tr("AboutQtMsg"));
mainLayout = new QGridLayout(this);
mainLayout->addWidget(label, 0, 0, 1, 2);
mainLayout->addWidget(questionBtn, 1, 0);
mainLayout->addWidget(informationBtn, 1, 1);
mainLayout->addWidget(warningBtn, 2, 0);
mainLayout->addWidget(criticalBtn, 2, 1);
mainLayout->addWidget(aboutBtn, 3, 0);
mainLayout->addWidget(aboutQtBtn, 3, 1);
//事件关联
connect(questionBtn, SIGNAL(clicked()), this, SLOT(showQuestionMsg()));
connect(informationBtn, SIGNAL(clicked()), this, SLOT(showInformationMsg()));
connect(warningBtn, SIGNAL(clicked()), this, SLOT(showWarningMsg()));
connect(criticalBtn, SIGNAL(clicked()), this, SLOT(showCriticalMsg()));
connect(aboutBtn, SIGNAL(clicked()), this, SLOT(showAboutMsg()));
connect(aboutQtBtn, SIGNAL(clicked()), this, SLOT(showAboutQtMsg()));
}
void MsgBoxDlg::showQuestionMsg() {
label->setText(tr("Question Message Box"));
switch(QMessageBox::question(
this,
tr("Question消息框"),
tr("您现在已经修改完成,是否要结束程序?"),
QMessageBox::Ok|QMessageBox::Cancel,
QMessageBox::Ok
)) {
case QMessageBox::Ok:
label->setText("Question button/Ok");
break;
case QMessageBox::Cancel:
label->setText("Question button/Cancel");
break;
default:
break;
}
}
void MsgBoxDlg::showInformationMsg() {
label->setText(tr("Information Message Box"));
QMessageBox::information(
this,
tr("Information消息框"),
tr("这是Information消息框测试,欢迎您!")
);
}
void MsgBoxDlg::showWarningMsg() {
label->setText(tr("Warning Message Box"));
switch(QMessageBox::warning(
this,
tr("Warning消息框"),
tr("您修改的内容还未保存,是否要保存对文档的修改?"),
QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel,
QMessageBox::Save
)){
case QMessageBox::Save:
label->setText(tr("Warning button/Save"));
break;
case QMessageBox::Discard:
label->setText(tr("Warning button/Discard"));
break;
case QMessageBox::Cancel:
label->setText(tr("Warning button/Cancel"));
break;
default:
break;
}
}
void MsgBoxDlg::showCriticalMsg() {
label->setText(tr("Critical Message Box"));
QMessageBox::critical(
this,
tr("Critical消息框"),
tr("这是一个Critical消息框测试!")
);
}
void MsgBoxDlg::showAboutMsg() {
label->setText(tr("About Message Box"));
QMessageBox::about(
this,
tr("About消息框"),
tr("这是一个About消息框测试!")
);
}
void MsgBoxDlg::showAboutQtMsg() {
label->setText(tr("About Qt Message Box"));
QMessageBox::aboutQt(
this,
tr("About Qt消息框")
);
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QLineEdit>
#include <QGridLayout>
#include "inputdlg.h"
#include "msgboxdlg.h"
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
private:
QPushButton *fileBtn;
QLineEdit *fileLineEdit;
QPushButton *colorBtn;
QFrame *colorFrame;
QPushButton *fontBtn;
QLineEdit *fontLineEdit;
QPushButton *inputBtn;
QPushButton *MsgBtn;
QPushButton *CustomBtn;
QLabel *label;
QGridLayout *mainLayout;
InputDlg *inputDlg;
MsgBoxDlg *msgDlg;
private slots:
void showFile();
void showColor();
void showFont();
void showInputDlg();
void showMsgDlg();
void showCustomDlg();
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include <QGridLayout>
#include <QFileDialog>
#include <QPushButton>
#include <QColorDialog>
#include <QFontDialog>
#include <QMessageBox>
Dialog::Dialog(QWidget *parent) : QDialog(parent) {
fileBtn = new QPushButton;
fileBtn->setText(tr("文件标准对话框实例"));
connect(fileBtn, SIGNAL(clicked()), this, SLOT(showFile()));
fileLineEdit = new QLineEdit; //用来显示选择的文件名
fileLineEdit->setReadOnly(true);
colorBtn = new QPushButton;
colorBtn->setText(tr("颜色标准对话框实例"));
connect(colorBtn, SIGNAL(clicked()), this, SLOT(showColor()));
colorFrame = new QFrame;
colorFrame->setFrameShape(QFrame::Box);
colorFrame->setAutoFillBackground(true);
colorFrame->setPalette(QPalette(Qt::blue));
fontBtn = new QPushButton;
fontBtn->setText(tr("字体标准对话框实例"));
connect(fontBtn, SIGNAL(clicked()), this, SLOT(showFont()));
fontLineEdit = new QLineEdit; //显示更改的字符串
fontLineEdit->setText(tr("Welcome!"));
fontLineEdit->setReadOnly(true);
inputBtn = new QPushButton;
inputBtn->setText(tr("标准输入对话框实例"));
connect(inputBtn, SIGNAL(clicked()), this, SLOT(showInputDlg()));
MsgBtn = new QPushButton; //创建控件对象
MsgBtn->setText(tr("标准消息对话框实例"));
connect(MsgBtn, SIGNAL(clicked()), this, SLOT(showMsgDlg()));
CustomBtn = new QPushButton;
CustomBtn->setText(tr("用户自定义消息对话框实例"));
connect(CustomBtn, SIGNAL(clicked()), this, SLOT(showCustomDlg()));
label = new QLabel;
label->setFrameStyle(QFrame::Panel|QFrame::Sunken);
mainLayout = new QGridLayout(this);
mainLayout->addWidget(fileBtn, 0, 0);
mainLayout->addWidget(fileLineEdit, 0, 1);
mainLayout->addWidget(colorBtn, 1, 0);
mainLayout->addWidget(colorFrame, 1, 1);
mainLayout->addWidget(fontBtn, 2, 0);
mainLayout->addWidget(fontLineEdit, 2, 1);
mainLayout->addWidget(inputBtn, 3, 0);
mainLayout->addWidget(MsgBtn, 3, 1);
mainLayout->addWidget(CustomBtn, 4, 0);
mainLayout->addWidget(label, 4, 1);
inputDlg = nullptr;
msgDlg = nullptr;
setWindowTitle(tr("各种标准对话框的实例"));
setWindowFlags(Qt::WindowCloseButtonHint);
}
void Dialog::showFile() {
QString s = QFileDialog::getOpenFileName(this, "open file dialog", "/", "C++ files(*.cpp);;C files(*.c);;Head files(*.h)");
if(!s.isEmpty())
fileLineEdit->setText(s);
}
void Dialog::showColor() {
QColor c = QColorDialog::getColor(colorFrame->palette().color(QPalette::Window));
if(c.isValid()) {
colorFrame->setPalette(QPalette(c));
}
}
void Dialog::showFont() {
bool ok;
QFont f = QFontDialog::getFont(&ok);
if(ok) {
fontLineEdit->setFont(f);
}
}
void Dialog::showInputDlg() {
if(inputDlg == nullptr)
inputDlg = new InputDlg(this);
inputDlg->show();
}
void Dialog::showMsgDlg() {
if(msgDlg == nullptr)
msgDlg = new MsgBoxDlg();
msgDlg->show();
}
void Dialog::showCustomDlg() {
label->setText(tr("Custom Message Box"));
QMessageBox customMsgBox;
QPushButton *yesBtn = customMsgBox.addButton(tr("Yes"), QMessageBox::ActionRole);
QPushButton *noBtn = customMsgBox.addButton(tr("No"), QMessageBox::ActionRole);
QPushButton *cancelBtn = customMsgBox.addButton(QMessageBox::Cancel);
customMsgBox.setWindowIcon(QIcon("Qt.png"));
customMsgBox.setWindowTitle(tr("用户自定义消息框")); //设置消息框的标题
customMsgBox.setText(tr("这是一个用户自定义消息框!"));
customMsgBox.setIconPixmap(QPixmap("Qt.png"));
customMsgBox.exec(); //显示此自定义消息框
if(customMsgBox.clickedButton() == yesBtn)
label->setText("Custom Message Box/Yes");
else if(customMsgBox.clickedButton() == noBtn)
label->setText("Custom Message Box/No");
else if(customMsgBox.clickedButton() == cancelBtn)
label->setText("Custom Message Box/Cancel");
}
通用对话框实例2
StandardDialogs.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = StandardDialogs
TEMPLATE = app
SOURCES += main.cpp \
dialog.cpp
HEADERS += dialog.h
main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QPushButton>
#include <QGroupBox>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QPlainTextEdit>
class Dialog : public QDialog {
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
private slots:
void on_btnOpen_clicked();
void on_btnOpenMulti_clicked();
void on_btnSelDir_clicked();
void on_btnSave_clicked();
void on_btnColor_clicked();
void on_btnFont_clicked();
void on_btnMsgQuestion_clicked();
void on_btnMsgInformation_clicked();
void on_btnMsgWarning_clicked();
void on_btnMsgCritical_clicked();
void on_btnMsgAbout_clicked();
void on_btnMsgAboutQt_clicked();
void on_btnInputString_clicked();
void on_btnInputInt_clicked();
void on_btnInputFloat_clicked();
void on_btnInputItem_clicked();
void on_btnClearText_clicked();
private:
QPushButton *btnOpen;
QPushButton *btnOpenMulti;
QPushButton *btnSelDir;
QPushButton *btnSave;
QPushButton *btnColor;
QPushButton *btnFont;
QGroupBox *groupBox_1; //标准对话框
QGridLayout *gridLayout_1;
QPushButton *btnMsgQuestion;
QPushButton *btnMsgInformation;
QPushButton *btnMsgWarning;
QPushButton *btnMsgCritical;
QPushButton *btnMsgAbout;
QPushButton *btnMsgAboutQt;
QGroupBox *groupBox_2; //标准消息框QMessageBox
QGridLayout *gridLayout_2;
QPushButton *btnInputString;
QPushButton *btnInputInt;
QPushButton *btnInputFloat;
QPushButton *btnInputItem;
QGroupBox *groupBox_3; //标准输入对话框QInputDialog
QGridLayout *gridLayout_3;
QPushButton *btnClearText;
QGroupBox *groupBox_4;
QGridLayout *gridLayout_4;
QGridLayout *gridLayout;
QPlainTextEdit *plainTextEdit;
QVBoxLayout *mainLayout;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include <QDir>
#include <QFileDialog>
#include <QColorDialog>
#include <QPalette>
#include <QFont>
#include <QFontDialog>
#include <QInputDialog>
#include <QMessageBox>
#include <QProgressDialog>
#include <QCoreApplication>
Dialog::Dialog(QWidget *parent) : QDialog(parent) {
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
btnOpen = new QPushButton(tr("打开一个文件"));
btnOpenMulti = new QPushButton(tr("打开多个文件"));
btnSelDir = new QPushButton(tr("选择已有目录"));
btnSave = new QPushButton(tr("保存文件"));
btnColor = new QPushButton(tr("选择颜色"));
btnFont = new QPushButton(tr("选择字体"));
groupBox_1 = new QGroupBox(tr("标准对话框"));
gridLayout_1 = new QGridLayout(groupBox_1);
gridLayout_1->addWidget(btnOpen, 0, 0);
gridLayout_1->addWidget(btnOpenMulti, 0, 1);
gridLayout_1->addWidget(btnSelDir, 1, 0);
gridLayout_1->addWidget(btnSave, 1, 1);
gridLayout_1->addWidget(btnColor, 2, 0);
gridLayout_1->addWidget(btnFont, 2, 1);
btnMsgQuestion = new QPushButton(tr("question"));
btnMsgInformation = new QPushButton(tr("information"));
btnMsgWarning = new QPushButton(tr("warning"));
btnMsgCritical = new QPushButton(tr("critical"));
btnMsgAbout = new QPushButton(tr("about"));
btnMsgAboutQt = new QPushButton(tr("aboutQt"));
groupBox_2 = new QGroupBox(tr("标准消息框QMessageBox"));
gridLayout_2 = new QGridLayout(groupBox_2);
gridLayout_2->addWidget(btnMsgQuestion, 0, 0);
gridLayout_2->addWidget(btnMsgInformation, 0, 1);
gridLayout_2->addWidget(btnMsgWarning, 0, 2);
gridLayout_2->addWidget(btnMsgCritical, 1, 0);
gridLayout_2->addWidget(btnMsgAbout, 1, 1);
gridLayout_2->addWidget(btnMsgAboutQt, 1, 2);
btnInputString = new QPushButton(tr("输入字符串"));
btnInputInt = new QPushButton(tr("输入整数"));
btnInputFloat = new QPushButton(tr("输入浮点数"));
btnInputItem = new QPushButton(tr("条目选择输入"));
groupBox_3 = new QGroupBox(tr("标准输入对话框QInputDialog"));
gridLayout_3 = new QGridLayout(groupBox_3);
gridLayout_3->addWidget(btnInputString, 0, 0);
gridLayout_3->addWidget(btnInputInt, 0, 1);
gridLayout_3->addWidget(btnInputFloat, 1, 0);
gridLayout_3->addWidget(btnInputItem, 1, 1);
btnClearText = new QPushButton(tr("清除文本框内容"));
groupBox_4 = new QGroupBox;
gridLayout_4 = new QGridLayout(groupBox_4);
gridLayout_4->addWidget(btnClearText);
gridLayout = new QGridLayout;
gridLayout->addWidget(groupBox_1, 0, 0);
gridLayout->addWidget(groupBox_2, 0, 1);
gridLayout->addWidget(groupBox_3, 1, 0);
gridLayout->addWidget(groupBox_4, 1, 1);
plainTextEdit = new QPlainTextEdit;
mainLayout = new QVBoxLayout(this);
mainLayout->addLayout(gridLayout);
mainLayout->addWidget(plainTextEdit);
connect(btnOpen, SIGNAL(clicked()), this, SLOT(on_btnOpen_clicked()));
connect(btnOpenMulti, SIGNAL(clicked()), this, SLOT(on_btnOpenMulti_clicked()));
connect(btnSelDir, SIGNAL(clicked()), this, SLOT(on_btnSelDir_clicked()));
connect(btnSave, SIGNAL(clicked()), this, SLOT(on_btnSave_clicked()));
connect(btnColor, SIGNAL(clicked()), this, SLOT(on_btnColor_clicked()));
connect(btnFont, SIGNAL(clicked()), this, SLOT(on_btnFont_clicked()));
connect(btnMsgQuestion, SIGNAL(clicked()), this, SLOT(on_btnMsgQuestion_clicked()));
connect(btnMsgInformation, SIGNAL(clicked()), this, SLOT(on_btnMsgInformation_clicked()));
connect(btnMsgWarning, SIGNAL(clicked()), this, SLOT(on_btnMsgWarning_clicked()));
connect(btnMsgCritical, SIGNAL(clicked()), this, SLOT(on_btnMsgCritical_clicked()));
connect(btnMsgAbout, SIGNAL(clicked()), this, SLOT(on_btnMsgAbout_clicked()));
connect(btnMsgAboutQt, SIGNAL(clicked()), this, SLOT(on_btnMsgAboutQt_clicked()));
connect(btnInputString, SIGNAL(clicked()), this, SLOT(on_btnInputString_clicked()));
connect(btnInputInt, SIGNAL(clicked()), this, SLOT(on_btnInputInt_clicked()));
connect(btnInputFloat, SIGNAL(clicked()), this, SLOT(on_btnInputFloat_clicked()));
connect(btnInputItem, SIGNAL(clicked()), this, SLOT(on_btnInputItem_clicked()));
connect(btnClearText, SIGNAL(clicked()), this, SLOT(on_btnClearText_clicked()));
}
void Dialog::on_btnOpen_clicked() { //选择单个文件
QString dlgTitle = tr("选择一个文件"); //对话框标题
QString curPath = QDir::currentPath();//获取系统当前目录
QString filter = tr("文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"); //文件过滤器
QString aFileName = QFileDialog::getOpenFileName(this, dlgTitle, curPath, filter);
if(!aFileName.isEmpty())
plainTextEdit->appendPlainText(aFileName);
}
void Dialog::on_btnOpenMulti_clicked() { //选择多个文件
QString dlgTitle = tr("选择多个文件"); //对话框标题
QString curPath = QDir::currentPath();//获取系统当前目录
QString filter = tr("文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"); //文件过滤器
QStringList fileList = QFileDialog::getOpenFileNames(this, dlgTitle, curPath, filter);
for (int i=0; i<fileList.count(); i++)
plainTextEdit->appendPlainText(fileList.at(i));
}
void Dialog::on_btnSelDir_clicked() { //选择文件夹
QString dlgTitle = tr("选择一个目录"); //对话框标题
QString curPath = QCoreApplication::applicationDirPath(); //获取应用程序的路径
QString selectedDir = QFileDialog::getExistingDirectory(this, dlgTitle, curPath, QFileDialog::ShowDirsOnly);
if(!selectedDir.isEmpty())
plainTextEdit->appendPlainText(selectedDir);
}
void Dialog::on_btnSave_clicked() {//保存文件
QString dlgTitle = tr("保存文件"); //对话框标题
QString curPath = QCoreApplication::applicationDirPath(); //获取应用程序的路径
QString filter = tr("文本文件(*.txt);;h文件(*.h);;C++文件(.cpp);;所有文件(*.*)"); //文件过滤器
QString aFileName = QFileDialog::getSaveFileName(this, dlgTitle, curPath, filter);
if(!aFileName.isEmpty())
plainTextEdit->appendPlainText(aFileName);
}
void Dialog::on_btnColor_clicked() {
QPalette pal = plainTextEdit->palette(); //获取现有 palette
QColor iniColor = pal.color(QPalette::Text); //现有的文字颜色
QColor color = QColorDialog::getColor(iniColor, this, tr("选择颜色"));
if(color.isValid()) {
pal.setColor(QPalette::Text, color); //palette 设置选择的颜色
plainTextEdit->setPalette(pal); //设置 palette
}
}
void Dialog::on_btnFont_clicked() {//选择字体
QFont iniFont = plainTextEdit->font(); //获取文本框的字体
bool ok = false;
QFont font = QFontDialog::getFont(&ok, iniFont); //选择字体
if(ok) //选择有效
plainTextEdit->setFont(font);
}
void Dialog::on_btnMsgQuestion_clicked() {
QString dlgTitle = tr("Question消息框");
QString strInfo = tr("文件已被修改,是否保存修改?");
QMessageBox::StandardButton defaultBtn = QMessageBox::NoButton; //缺省按钮
//返回选择的按钮
QMessageBox::StandardButton result = QMessageBox::question(this, dlgTitle, strInfo,
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, defaultBtn);
if (result==QMessageBox::Yes)
plainTextEdit->appendPlainText(tr("Question消息框: Yes 被选择"));
else if(result==QMessageBox::No)
plainTextEdit->appendPlainText(tr("Question消息框: No 被选择"));
else if(result==QMessageBox::Cancel)
plainTextEdit->appendPlainText(tr("Question消息框: Cancel 被选择"));
else
plainTextEdit->appendPlainText(tr("Question消息框: 无选择"));
}
void Dialog::on_btnMsgInformation_clicked() {
QString dlgTitle = tr("information消息框");
QString strInfo = tr("文件已经打开,字体大小已设置");
QMessageBox::information(this, dlgTitle, strInfo,
QMessageBox::Ok, QMessageBox::NoButton);
}
void Dialog::on_btnMsgWarning_clicked() {
QString dlgTitle = tr("warning 消息框");
QString strInfo = tr("文件内容已经被修改");
QMessageBox::warning(this, dlgTitle, strInfo);
}
void Dialog::on_btnMsgCritical_clicked() {
QString dlgTitle = tr("critical消息框");
QString strInfo = tr("有不明程序访问网络");
QMessageBox::critical(this, dlgTitle, strInfo);
}
void Dialog::on_btnMsgAbout_clicked() {
QString dlgTitle = tr("about消息框");
QString strInfo = tr("我开发的数据查看软件 V1.0 \n 保留所有版权");
QMessageBox::about(this, dlgTitle, strInfo);
}
void Dialog::on_btnMsgAboutQt_clicked(){
QString dlgTitle = tr("aboutQt消息框");
QMessageBox::aboutQt(this, dlgTitle);
}
void Dialog::on_btnInputString_clicked() { //输入字符串
QString dlgTitle = tr("输入文字对话框");
QString txtLabel = tr("请输入文件名");
QLineEdit::EchoMode echoMode = QLineEdit::Normal;//正常文字输入, QLineEdit::Password密码输入
QString defaultInput = tr("新建文件.txt");
bool ok = false;
QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode, defaultInput, &ok);
if(ok && !text.isEmpty())
plainTextEdit->appendPlainText(text);
}
void Dialog::on_btnInputInt_clicked() {//输入整数
QString dlgTitle = tr("输入整数对话框");
QString txtLabel = tr("设置字体大小");
QFont font = plainTextEdit->font();
int defaultValue = font.pointSize(); //现有字体大小
int minValue=6, maxValue=50, stepValue=1; //范围,步长
bool ok = false;
int inputValue = QInputDialog::getInt(this, dlgTitle, txtLabel,
defaultValue, minValue, maxValue, stepValue, &ok);
if(ok) {
font.setPointSize(inputValue);
plainTextEdit->setFont(font);
}
}
void Dialog::on_btnInputFloat_clicked() { //输入浮点数
QString dlgTitle = tr("输入浮点数对话框");
QString txtLabel = tr("输入一个浮点数");
float defaultValue = 3.13;
float minValue=0, maxValue=10000; //范围
int decimals=2;//小数点位数
bool ok = false;
float inputValue = QInputDialog::getDouble(this, dlgTitle, txtLabel,
defaultValue, minValue, maxValue, decimals, &ok);
if(ok) {
QString str = QString::asprintf("输入了一个浮点数:%.2f", inputValue);
plainTextEdit->appendPlainText(str);
}
}
void Dialog::on_btnInputItem_clicked() { //条目选择输入
QStringList items; //ComboBox 列表的内容
items <<"优秀"<<"良好"<<"合格"<<"不合格";
QString dlgTitle = tr("条目选择对话框");
QString txtLabel = tr("请选择级别");
int curIndex=0; //初始选择项
bool editable=true; //ComboBox是否可编辑
bool ok=false;
QString text = QInputDialog::getItem(this, dlgTitle, txtLabel, items, curIndex, editable, &ok);
if(ok && !text.isEmpty())
plainTextEdit->appendPlainText(text);
}
void Dialog::on_btnClearText_clicked() {
plainTextEdit->clear();
}
可扩展对话框
ExtensionDlg.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = ExtensionDlg
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp \
extensiondlg.cpp
HEADERS += extensiondlg.h
main.cpp
#include "extensiondlg.h"
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
ExtensionDlg w;
w.show();
return a.exec();
}
extensiondlg.h
#ifndef EXTENSIONDLG_H
#define EXTENSIONDLG_H
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QPushButton>
#include <QDialogButtonBox>
#include <QHBoxLayout>
#include <QVBoxLayout>
class ExtensionDlg : public QDialog {
Q_OBJECT
public:
explicit ExtensionDlg(QWidget *parent = 0);
private slots:
void showDetailInfo();
private:
//基本对话窗体部分
QLabel *nameLabel;
QLineEdit *nameLineEdit;
QLabel *sexLabel;
QComboBox *sexComboBox;
QGridLayout *LeftLayout;
QPushButton *OKBtn;
QPushButton *DetailBtn;
QDialogButtonBox *btnBox;
QWidget *baseWidget;
QHBoxLayout *baseLayout;
//扩展窗体部分
QLabel *ageLabel;
QLineEdit *ageLineEdit;
QLabel *departmentLabel;
QComboBox *departmentComBox;
QLabel *emailLabel;
QLineEdit *emailLineEdit;
QWidget *detailWidget;
QGridLayout *detailLayout;
QVBoxLayout *mainLayout;
};
#endif // EXTENSIONDLG_H
extensiondlg.cpp
#include "extensiondlg.h"
ExtensionDlg::ExtensionDlg(QWidget *parent) : QDialog(parent) {
setWindowFlags(Qt::WindowCloseButtonHint);
setWindowTitle(tr("Extension Dialog"));
//实现基本对话窗体部分
nameLabel = new QLabel(tr("姓名:"));
nameLineEdit = new QLineEdit;
sexLabel = new QLabel(tr("性别:"));
sexComboBox = new QComboBox;
sexComboBox->insertItem(0,tr("女"));
sexComboBox->insertItem(1,tr("男"));
LeftLayout = new QGridLayout;
LeftLayout->addWidget(nameLabel, 0, 0);
LeftLayout->addWidget(nameLineEdit, 0, 1);
LeftLayout->addWidget(sexLabel, 1, 0);
LeftLayout->addWidget(sexComboBox, 1, 1);
OKBtn = new QPushButton(tr("确定"));
DetailBtn = new QPushButton(tr("详细"));
connect(DetailBtn, SIGNAL(clicked()), this, SLOT(showDetailInfo()));
btnBox = new QDialogButtonBox(Qt::Vertical);
btnBox->addButton(OKBtn, QDialogButtonBox::ActionRole);
btnBox->addButton(DetailBtn, QDialogButtonBox::ActionRole);
baseWidget = new QWidget;
baseLayout = new QHBoxLayout(baseWidget);
baseLayout->addLayout(LeftLayout);
baseLayout->addWidget(btnBox);
//实现扩展窗体部分
ageLabel = new QLabel(tr("年龄:"));
ageLineEdit = new QLineEdit(tr("30"));
departmentLabel = new QLabel(tr("部门:"));
departmentComBox = new QComboBox;
departmentComBox->addItem(tr("部门1"));
departmentComBox->addItem(tr("部门2"));
departmentComBox->addItem(tr("部门3"));
departmentComBox->addItem(tr("部门4"));
emailLabel = new QLabel(tr("email:"));
emailLineEdit = new QLineEdit;
detailWidget = new QWidget;
detailWidget->hide();
detailLayout = new QGridLayout(detailWidget);
detailLayout->addWidget(ageLabel, 0, 0);
detailLayout->addWidget(ageLineEdit, 0, 1);
detailLayout->addWidget(departmentLabel, 1, 0);
detailLayout->addWidget(departmentComBox, 1, 1);
detailLayout->addWidget(emailLabel, 2, 0);
detailLayout->addWidget(emailLineEdit, 2, 1);
//
mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(baseWidget);
mainLayout->addWidget(detailWidget);
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
mainLayout->setSpacing(10);
}
void ExtensionDlg::showDetailInfo() {
if(detailWidget->isHidden())
detailWidget->show();
else
detailWidget->hide();
}