引言
可拓展对话框主要是由setSizeConstraint(QLayout::SetFixedSize);语句实现的,这条语句固定了各个控件组合的尺寸,在拓展部分显示时,对话框尺寸根据显示的控件调整,在隐藏拓展部分时,对话框恢复至原来大小。
效果图
单击详细按钮后:
代码关键步骤已做相关注释
.h文件中将需要用到的几个函数声明,包括基本显示框,拓展框,显示检测
#include <QDialog>
class ExtensionDlg : public QDialog
{
Q_OBJECT
public:
ExtensionDlg(QWidget *parent = 0);
~ExtensionDlg();
private slots:
void showDetailInfo();
private:
void createBaseInfo(); //实现基本对话窗体部分
void createDetailInfo(); //实现扩展窗体部分
QWidget *baseWidget; //基本对话窗体部分
QWidget *detailWidget; //扩展窗体部分
};
主函数
#include "extensiondlg.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QPushButton>
#include <QDialogButtonBox>
#include <QHBoxLayout>
ExtensionDlg::ExtensionDlg(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr("Extension Dialog")); //设置对话框的标题栏信息
createBaseInfo();
createDetailInfo();
QVBoxLayout *layout =new QVBoxLayout(this); //主窗口和拓展窗口垂直布局
layout->addWidget(baseWidget); //上面放主窗口
layout->addWidget(detailWidget); //下面放拓展窗口
layout->setSizeConstraint(QLayout::SetFixedSize); //固定控件尺寸
layout->setSpacing(10);
}
基本显示窗口
void ExtensionDlg::createBaseInfo()
{
//基本设置
baseWidget =new QWidget;
QLabel *nameLabel =new QLabel(tr("姓名:"));
QLineEdit *nameLineEdit =new QLineEdit;
QLabel *sexLabel =new QLabel(tr("性别:"));
QComboBox *sexComboBox =new QComboBox;
sexComboBox->insertItem(0,tr("女"));
sexComboBox->insertItem(1,tr("男"));
QGridLayout *LeftLayout =new QGridLayout;
//布局分为左右两部分,左侧布局为垂直布局
LeftLayout->addWidget(nameLabel,0,0);
LeftLayout->addWidget(nameLineEdit,0,1);
LeftLayout->addWidget(sexLabel);
LeftLayout->addWidget(sexComboBox);
QPushButton *OKBtn =new QPushButton(tr("确定"));
QPushButton *DetailBtn =new QPushButton(tr("详细"));
QDialogButtonBox *btnBox =new QDialogButtonBox(Qt::Vertical);
//buttonBox中放置两个按钮,垂直排列
btnBox->addButton(OKBtn,QDialogButtonBox::ActionRole);
btnBox->addButton(DetailBtn,QDialogButtonBox::ActionRole);
//设置整体布局,整体为水平布局,左侧文本框竖排排列,右侧按钮竖排排列,整体横向
QHBoxLayout *mainLayout =new QHBoxLayout(baseWidget);
mainLayout->addLayout(LeftLayout);
mainLayout->addWidget(btnBox);
connect(DetailBtn,SIGNAL(clicked()),this,SLOT(showDetailInfo()));
}
拓展窗体显示
void ExtensionDlg::createDetailInfo()
{
detailWidget =new QWidget;
QLabel *ageLabel =new QLabel(tr("年龄:"));
QLineEdit *ageLineEdit =new QLineEdit;
ageLineEdit->setText(tr("30"));
QLabel *departmentLabel =new QLabel(tr("部门:"));
QComboBox *departmentComBox =new QComboBox;
departmentComBox->addItem(tr("部门1"));
departmentComBox->addItem(tr("部门2"));
departmentComBox->addItem(tr("部门3"));
departmentComBox->addItem(tr("部门4"));
QLabel *emailLabel =new QLabel(tr("email:"));
QLineEdit *emailLineEdit =new QLineEdit;
//拓展窗口布局,使用布局管理器,放置坐标
QGridLayout *mainLayout =new QGridLayout(detailWidget);
mainLayout->addWidget(ageLabel,0,0);
mainLayout->addWidget(ageLineEdit,0,1);
mainLayout->addWidget(departmentLabel,1,0);
mainLayout->addWidget(departmentComBox,1,1);
mainLayout->addWidget(emailLabel,2,0);
mainLayout->addWidget(emailLineEdit,2,1);
//默认拓展窗体隐藏
detailWidget->hide();
}
显示检测,默认隐藏,按钮按下后执行此函数
void ExtensionDlg::showDetailInfo()
{
if(detailWidget->isHidden())
detailWidget->show();
else detailWidget->hide();
}