文章目录
- QFormLayout
- QGridLayout
- QFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例
- 用QFormLayout 代替 界面左边部分的QGridLayout
QFormLayout
#include "widget.h"
#include <QFormLayout>
#include <QLineEdit>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//固定窗口大小
setFixedSize(250,200);
// 创建表单布局指针
QFormLayout *qLayout=new QFormLayout(this);
QLineEdit *le1=new QLineEdit(); // 输入学号
QLineEdit *le2=new QLineEdit(); // 输入姓名
QLineEdit *le3=new QLineEdit(); // 输入学校
qLayout->addRow("学号",le1);
qLayout->addRow("姓名",le2);
qLayout->addRow("学校",le3);
qLayout->setSpacing(10);
// WrapAllRows将标签显示在单行编辑框上面
//qLayout->setRowWrapPolicy(QFormLayout::WrapAllRows);
// 当标签和单选编辑框,将标签显示在同一行。
qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);
qLayout->setLabelAlignment(Qt::AlignLeft); // 设置标签对齐方式
setWindowTitle("表单布局测试案例");
}
qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);效果
qLayout->setRowWrapPolicy(QFormLayout::WrapAllRows);效果
QGridLayout
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
button1=new QPushButton(this);
button1->setText("第一区:顶部菜单栏选项");
//button1->setFixedHeight(60); // 设置固定大小高度
//把QPushButton控件的大小策略设定为在水平和垂直方向上都能自动扩展。
//当窗口大小发生改变时,按钮能够依据布局的变化自动调整自身大小
button1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
button2=new QPushButton(this);
button2->setText("第二区:侧边栏选项");
//button2->setFixedWidth(150); // 设置固定大小宽度
button2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
button3=new QPushButton(this);
button3->setText("第三区:底部选项");
//button3->setFixedHeight(60);
button3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
button4=new QPushButton(this);
button4->setText("第四区:子窗体选项");
//button4->setFixedHeight(60);
button4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
//网格布局类
pGrid_layouts=new QGridLayout();
// 通过此函数设置左侧 顶部 右侧 底部边距,主要方便布局周围进行使用
pGrid_layouts->setContentsMargins(0,0,0,0);
// 用于设置布局四周的边距
// pGrid_layouts->setMargin(30);//5.12开始被弃用
pGrid_layouts->setContentsMargins(10,10,10,10);
//设置QGridLayout中各个控件之间间距
pGrid_layouts->setSpacing(0);
// 显示位置
// addWidget(参数1,参数2,参数3,参数4,参数5,参数6)
/*
1:我要插入的子布局对象
2:插入的开始行
3:插入的开始列
4:占用的行数
5:占用的列数
6:指定对齐方式
*/
pGrid_layouts->addWidget(button1,0,1);
pGrid_layouts->addWidget(button2,0,0,3,1);
pGrid_layouts->addWidget(button3,2,1);
pGrid_layouts->addWidget(button4,1,1);
//给部件设置布局
setLayout(pGrid_layouts);
}
第一区:第0行、第1列
第二区:第0行、第0列、占用3行,1列
第三区:第1行、第1列
第四区:第2行、第1列
QFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QGridLayout>
#include <QPushButton>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
// 1:左边 网格布局、表格布局
QGridLayout *lLayout;
QLabel *UserNumber;
QLineEdit *UserNumberLineEdit;
QLabel *UserName;
QLineEdit *UserNameLineEdit;
QLabel *UserSex;
QComboBox *UserSexCombobox;
QLabel *UserDepart;
QTextEdit *UserDepartTextEdit;
QLabel *UserAge;
QLineEdit *UserAgeLineEdit;
// 2:右边 水平布局
QHBoxLayout *toprightlayout;
QVBoxLayout *rightlayout;
QLabel *MyselfInfo;
QTextEdit *MyselfInfoTextEdit;
// 3:右边底部
QPushButton *okbutton,*cancelbutton;
QHBoxLayout *buttomLayout;
};
#include "dialog.h"
#include <QFormLayout>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("员工信息");
// 左边控件
UserNumber=new QLabel("员工编号:");
UserNumberLineEdit=new QLineEdit;
UserName=new QLabel("员工姓名:");
UserNameLineEdit=new QLineEdit;
UserSex=new QLabel("员工性别:");
UserSexCombobox=new QComboBox;
UserSexCombobox->addItem("男");
UserSexCombobox->addItem("女");
UserDepart=new QLabel("所在部门:");
UserDepartTextEdit=new QTextEdit;
UserAge=new QLabel("员工年龄:");
UserAgeLineEdit=new QLineEdit;
// 网格布局
lLayout=new QGridLayout();
// addWidget(参数1,参数2,参数3,参数4,参数5,参数6)
/*
1:我要插入的子布局对象
2:插入的开始行
3:插入的开始列
4:占用的行数
5:占用的列数
6:指定对齐方式
*/
lLayout->addWidget(UserNumber,0,0); // 员工编号
lLayout->addWidget(UserNumberLineEdit,0,1);
lLayout->addWidget(UserName,1,0);
lLayout->addWidget(UserNameLineEdit,1,1);
lLayout->addWidget(UserSex,2,0);
lLayout->addWidget(UserSexCombobox,2,1);
lLayout->addWidget(UserDepart,3,0);
lLayout->addWidget(UserDepartTextEdit,3,1);
lLayout->addWidget(UserAge,4,0);
lLayout->addWidget(UserAgeLineEdit,4,1);
//设置网格布局(QGridLayout)列拉伸系数的方法
//有两列,拉伸系数分别为 1 和 3,那么第二列将获得比第一列多两倍的额外空间。
lLayout->setColumnStretch(0,1);
lLayout->setColumnStretch(1,3);
// 右边上部分
//右边为垂直布局里个人简历为垂直布局,其他信息为水平布局
toprightlayout=new QHBoxLayout();
toprightlayout->setSpacing(5);
MyselfInfo=new QLabel("个人简历:");
MyselfInfoTextEdit=new QTextEdit;
QLabel* MyselfInfo1=new QLabel("其他信息:");
QTextEdit* MyselfInfoTextEdit1=new QTextEdit;
//个人简历加到垂直布局
toprightlayout->addWidget(MyselfInfo1);
toprightlayout->addWidget(MyselfInfoTextEdit1);
rightlayout=new QVBoxLayout();
//把水平布局放进主界面右边的垂直布局
rightlayout->addWidget(MyselfInfo);
//把其他信息放进水平布局
rightlayout->addWidget(MyselfInfoTextEdit);
rightlayout->addLayout(toprightlayout);
// 右边下部分
okbutton=new QPushButton("确认");
cancelbutton=new QPushButton("退出");
buttomLayout=new QHBoxLayout();
buttomLayout->addStretch();
buttomLayout->addWidget(okbutton);
buttomLayout->addWidget(cancelbutton);
QGridLayout *mlayout=new QGridLayout(this);//隐式设置Dialog的布局为mlayout
mlayout->setMargin(20);
mlayout->setSpacing(10);
mlayout->addLayout(lLayout,0,0); // 左边
//mlayout->addLayout(qLayout,0,0);
mlayout->addLayout(rightlayout,0,1); // 右上
mlayout->addLayout(buttomLayout,1,0,1,2);
//窗口会根据布局里内容的尺寸来自动调整初始大小,并且用户无法对窗口大小进行更改
mlayout->setSizeConstraint(QLayout::SetFixedSize);
//new QGridLayout(this);这里不隐式设定布局就要显示设置setLayout(mlayout);
//不然界面无法显示
//setLayout(mlayout);
}
用QFormLayout 代替 界面左边部分的QGridLayout
#include "dialog.h"
#include <QFormLayout>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("员工信息");
/*****
QFormLayout *qLayout=new QFormLayout(this);// 隐式设置Dialog的布局为qLayout
错误
这里如果传了this就会把qLayout设置为定成布局,就只会显示qLayout的界面
*****/
//Qt规则:当通过 new QLayout(widget) 创建布局时,会自动调用 widget->setLayout()
//后果:Dialog 的布局被先后设置为 qLayout 和 mlayout,违反 单顶级布局原则
QFormLayout *qLayout=new QFormLayout();
QLineEdit *le1=new QLineEdit(); // 员工编号:
QComboBox *le2=new QComboBox(); // 员工姓名:
le2->addItem("男");
le2->addItem("女");
QLineEdit *le3=new QLineEdit(); // 员工性别:
QTextEdit *le4=new QTextEdit(); // 所在部门:
QLineEdit *le5=new QLineEdit(); // 员工年龄:
qLayout->addRow("员工编号:",le1);
qLayout->addRow("员工姓名:",le2);
qLayout->addRow("员工性别:",le3);
qLayout->addRow("所在部门:",le4);
qLayout->addRow("员工年龄:",le5);
qLayout->setSpacing(10);
qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);
qLayout->setLabelAlignment(Qt::AlignLeft); // 设置标签对齐方式
// 右边上部分
toprightlayout=new QHBoxLayout();
toprightlayout->setSpacing(5);
MyselfInfo=new QLabel("个人简历:");
MyselfInfoTextEdit=new QTextEdit;
QLabel* MyselfInfo1=new QLabel("其他信息:");
QTextEdit* MyselfInfoTextEdit1=new QTextEdit;
toprightlayout->addWidget(MyselfInfo1);
toprightlayout->addWidget(MyselfInfoTextEdit1);
rightlayout=new QVBoxLayout();
rightlayout->addWidget(MyselfInfo);
rightlayout->addWidget(MyselfInfoTextEdit);
rightlayout->addLayout(toprightlayout);
// 右边下部分
okbutton=new QPushButton("确认");
cancelbutton=new QPushButton("退出");
buttomLayout=new QHBoxLayout();
buttomLayout->addStretch();
buttomLayout->addWidget(okbutton);
buttomLayout->addWidget(cancelbutton);
QGridLayout *mlayout=new QGridLayout(this);//隐式设置Dialog的布局为mlayout
mlayout->setMargin(20);
mlayout->setSpacing(10);
//mlayout->addLayout(lLayout,0,0); // 左边
mlayout->addLayout(qLayout,0,0);
mlayout->addLayout(rightlayout,0,1); // 右上
mlayout->addLayout(buttomLayout,1,0,1,2);
//窗口会根据布局里内容的尺寸来自动调整初始大小,并且用户无法对窗口大小进行更改
mlayout->setSizeConstraint(QLayout::SetFixedSize);
//setLayout(mlayout);
}
两个显示效果都是这个