目录
可扩展对话框setSizeConstraint () 20210120
可扩展对话框setSizeConstraint () 20210120
在扩展部分显示时,对话框尺寸根据需要显示的控件被扩展;而当扩展部分隐藏时,对话框尺寸又恢复至初始状态。
涉及函数及用法:layout->setSizeConstraint(QLayout::SetFixedSize);
实例:
新建:Qt Widgets Application
项目名称:ExtensionDlg
类名:ExtensionDlg
基类:QDialog
不选择“创建界面”
代码及详细注释如下:
【extensiondlg.cpp】
#include "extensiondlg.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QPushButton>
#include <QDialogButtonBox>
ExtensionDlg::ExtensionDlg(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr("可扩展对话框"));
createBaseInfo(); //创建基本信息页
createDetailInfo(); //详细信息页(呈隐藏状态,需要时扩展显示)
//垂直布局
QVBoxLayout *layout = new QVBoxLayout(this); //this
layout->addWidget(baseWidget);
layout->addWidget(detailWidget);
layout->setSizeConstraint(QLayout::SetFixedSize); //对话框窗体大小固定,始终保持各个控件组合的默认尺寸,拖拽不改变大小。
layout->setSpacing(10); //间距
}
ExtensionDlg::~ExtensionDlg()
{
}
//基本信息
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("女")); //insertItem()或者addItem()
sexComboBox->insertItem(1,tr("男"));
//左边:网格布局
QGridLayout *LeftLayout = new QGridLayout;
LeftLayout->addWidget(nameLabel,0,0);
LeftLayout->addWidget(nameLineEdit,0,1);
LeftLayout->addWidget(sexLabel,1,0);
LeftLayout->addWidget(sexComboBox,1,1);
QPushButton *OkBtn = new QPushButton(tr("确定")); //QPushButton *OkBtn = new QPushButton;
QPushButton *DetailBtn = new QPushButton(tr("详细")); //QPushButton *DetailBtn = new QPushButton;
QDialogButtonBox *btnBox = new QDialogButtonBox(Qt::Vertical);
btnBox->addButton(OkBtn,QDialogButtonBox::ActionRole);//ActionRole
btnBox->addButton(DetailBtn,QDialogButtonBox::ActionRole);
//整体:水平布局
QHBoxLayout *mainLayout = new QHBoxLayout(baseWidget);//baseWidget一定要加上
mainLayout->addLayout(LeftLayout); //addLayout()布局
mainLayout->addWidget(btnBox); //addWidget()控件
//按钮关联事件
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("23"));
QLabel *departmentLabel = new QLabel(tr("部门:"));
QComboBox *departmentComboBox = new QComboBox;
departmentComboBox->addItem(tr("工程室")); //addItem()或者insertItem()
departmentComboBox->addItem(tr("采购室"));
departmentComboBox->addItem(tr("计划室"));
departmentComboBox->addItem(tr("财务室"));
QLabel *emailLabel = new QLabel(tr("邮箱:"));
QLineEdit *emailLineEdit = new QLineEdit;
//网格布局
QGridLayout *mainLayout = new QGridLayout(detailWidget); //detailWidget一定要加上
mainLayout->addWidget(ageLabel,0,0);
mainLayout->addWidget(ageLineEdit,0,1);
mainLayout->addWidget(departmentLabel,1,0);
mainLayout->addWidget(departmentComboBox,1,1);
mainLayout->addWidget(emailLabel,2,0);
mainLayout->addWidget(emailLineEdit,2,1);
detailWidget->hide();
}
void ExtensionDlg::showDetailInfo()
{
if(detailWidget->isHidden())
detailWidget->show(); //显示detailWidget窗体
else
detailWidget->hide(); //隐藏detailWidget窗体
}
【extensiondlg.h】
#ifndef EXTENSIONDLG_H
#define EXTENSIONDLG_H
#include <QDialog>
class ExtensionDlg : public QDialog //ExtensionDlg类继承自QDialog类
{
Q_OBJECT //Q_OBJECT是个宏。作用是启动Qt5元对象系统的一些特性(如支持信号和槽等)。它必须放在类定义的私有区中。
public:
ExtensionDlg(QWidget *parent = 0);
~ExtensionDlg();
private:
void createBaseInfo();
void createDetailInfo();
QWidget *baseWidget;
QWidget *detailWidget;
private slots:
void showDetailInfo();
};
#endif // EXTENSIONDLG_H
【main.cpp】
#include "extensiondlg.h" //使用哪个类就必须把包含该类的头文件引用过来(*.h文件中包含了相应类的定义)
#include <QApplication> //每个使用[Qt图形化应用程序]中都必须使用一个QApplication对象
//QApplication管理各种各样的图形化应用程序的广泛资源、基本设置、控制流及事件处理等
int main(int argc, char *argv[]) //这里是应用程序的入口。几乎所有使用Qt的情况下,main()函数只需在将控制转交给Qt库之前执行初始化,然后Qt库通过事件向程序告知用户的行为。
//所有Qt程序必须有且只有一个main()函数。argc是命令行变量的数量,argv是命令行变量的数组。
{
QApplication a(argc, argv); // a是创建的QApplication类的对象,用来处理命令行变量。所有被Qt识别的命令行参数都将从argv中移去,argc也因此减少
ExtensionDlg w; //创建ExtensionDlg类的对象(包含该类头文件)
w.show(); //窗口部件可见
return a.exec(); //main()函数将控制权交给Qt,Qt完成事件处理工作,当应用程序退出的时候,exec()函数的值就会返回。
//exec()函数中,Qt接收并处理用户和系统的事件,并且将他们传递给适当的窗口部件。
}