QT之LayOut布局

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);


}

两个显示效果都是这个

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值