十一 布局管理

前言

  1. Qt提供了很多拜访控件的辅助工具
  2. 主布局和子布局
条目代码说明(Creator操作)
主布局widget::setLayout在这里插入图片描述
creator 对话框编辑器上面的
子副局widget::addLayout在这里插入图片描述
子布局

:

一、五种布局管理器

在这里插入图片描述

QVBoxLayout 垂直布局

  1. VBox布局
    在这里插入图片描述
QVBoxLayout();
QVBoxLayout(QWidget* parent);
  1. 简易使用方法
//1.主要窗口
QWidget wid;
wid.setWindowTitle("垂直布局";
//2.new QVBoxLayout 
QVBoxLayout *layout = new QVBoxLayout();
layout->setDirection(QBoxLayout::BottomToTop);
//3 窗口包含layout
wid.setLayout(layout );
//4. layout 包含控件
layout->addStretch(2);
layout->addWidget(&lab1,1)
layout->addWidget(&lab2,1)
layout->addStretch(1); 
  1. 函数
成员函数功能
添加控件—说明—
addWidget向布局中增加widget控件
addWidget(QWidget*,int stretch)
stretch = 就是未来的占位比例
添加空白—说明—
addStretch(int strech)添加空白行
addSpacing(int size)添加一个固定大小size的间距
设置距离—说明—
setMargin(int margin)设置自己的边界
setContentsMargins设置内部控件的边界
factor—说明—
setStretchFactor(QWidget *widget, int stretch)设置控件比列
setStretchFactor(QLayout *layout, int stretch)设置内部布局比列
  1. qtCreator设置
    4.1 设置布局
    在qtCreator 设计器的上面就可以设置窗口的布局 = wid->setLayout(&lay);
编辑器设置布局主布局代码 setLayout
在这里插入图片描述QWidget widget;
QVBoxLayout *layout = new QVBoxLayout();
widget.setLayout(layout );

另外,控件面板上的QVBoxLayout 实际上是子级布局

setLayout
addLayout
QWidget
主布局
子布局
主布局widLayout子布局 childLayout
在这里插入图片描述
wid->setLayout(widLayout)
---说明---
widLayout->addLayout(childLayout);

4.2 设置stretch
这里一共5个控件布置在主布局QVBoxLayout中
在属性中的设置为

控件比例其他
v-spacer0固定高度45 详细见下图
label1TextLabel1
label2TextLabel2
label3TextLabel3
OK-CANCEL1
窗口属性设置比列
在这里插入图片描述在这里插入图片描述
a.第一个控件:spacer的固定高度设置为45,其stretch = 0特别:如果其他不设置stretch,spacer就会无限占位
b.第二个控件:Lab,stretch = 1
c.第三个控件:Lab,stretch = 2
c.第四个控件:buttons,stretch = 1对于button,展位是增大的,但是不会上下扩展
Spacer设置Spacer控件列表
在这里插入图片描述在这里插入图片描述
Spacer=固定大小占位,stretch=0

4.3 例子

 //创建Lab 使用 setStyleSheet设置样式
 //连续创建 3 个文本框,并设置它们的背景和字体大小
    QLabel lab1("Label1");
    lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
    lab1.setAlignment(Qt::AlignCenter);
    QLabel lab2("Label2");
    lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
    lab2.setAlignment(Qt::AlignCenter);
    QLabel lab3("Label3");
    lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
    lab3.setAlignment(Qt::AlignCenter);
    
  //将 3 个文本框和 2 个空白列添加到管理器中,它们的拉伸系数比是 2:1:2:3:3
    layout->addStretch(2);
    layout->addWidget(&lab1,1);
    layout->addWidget(&lab2,2);
    layout->addWidget(&lab3,3);
    layout->addStretch(3);
    widget.setLayout(layout);
    widget.show();

4.4 QLabel的设置

  1. setStyleSheet使用
改背景颜色qtCreator + 代码
在这里插入图片描述在这里插入图片描述
lab.setStyleSheet("QLable{background:rgb(170,0,0);}")
差别:
是否需要QLabel{XXX} 这个标志

QHBoxLayout水平布局

在这里插入图片描述

  1. 主要函数与VBox相同
    函数

hbox.addWidget(QWidget*);
hbox.addStretch(int );
Window.setLayout(hbox);

QGridLayout 布局

在这里插入图片描述
函数

QGridLayout成员函数功能
查询函数-----说明------
rowCount()行数
columnCount()列数
添加控件-----说明------
addWidget()(QWidget *widget, int row, int column) 在row col位置添加控件
addWidget()fromRow, int fromColumn, int rowSpan, int columnSpan, 跨行列
添加子布局-----说明------
addLayout()QLayout *layout, int row, int column, int rowSpan, int columnSpan,添加子布局
设置stretch-----说明------
setColumnStretch(int column, int stretch)设置列的stretch
setRowStretch(int row, int stretch)设置行的stretch

addWidget(ctrl,row,column);直接指定位置,不用先设置有多少行列

 QGridLayout *layout = new QGridLayout;
   //向 layout 中添加控件,并指定各个控件的位置
   layout->addWidget(but1, 0, 0);
   layout->addWidget(but2, 0, 2);
   layout->addWidget(lab3, 1, 0, 3, 3);
   layout->addWidget(but3, 4, 0);
   layout->addWidget(but4, 4, 2);
   //将 layout 添加到 widget 窗口中
   widget.setLayout(layout);

QFormLayout 表单布局

  1. 左边是QLabel 右边是控件
  2. 函数
函数说明
添加-----说明-----
addRow(QWidget *label, QWidget *field)左边label 右边field
addRow(const QString &labelText, QWidget *field)左边label 右边field
insertRow(int row, const QString &labelText, QWidget *field)左边label 右边field
删除-----说明-----
removeRow(int row)
换行策略-----说明-----
setRowWrapPolicy(RowWrapPolicy policy)DontWrapRows 标签始终在左
WrapLongRows标签可以在左也可以在上
WrapAllRows标签始终在上

在这里插入图片描述

  1. 例子说明
函数说明
在这里插入图片描述标签始终在上面setRowWrapPolicy(QFormLayout::WrapAllRows)
添加一行layout->addRow(“Name:”,new QLineEdit());
间距setSpacing(10);
    QFormLayout* layout = new QFormLayout();
    //设置表单中的标签都位于控件的上方
    layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
    //添加 3 行输入框和标签
    layout->addRow("Name:",new QLineEdit());
    layout->addRow("Email:",new QLineEdit());
    layout->addRow("Adress:",new QLineEdit());
    //设置行间距和列间距为 10
    layout->setSpacing(10);
    //将 layout 表单添加到 widget 窗口中
    widget.setLayout(layout);

QStackedLayout分组布局

在这里插入图片描述

setLayout
addWidget stretch=1
addLayout stretch=4
addWidget
addWidget
addWidget
主窗口
QHBoxLayout
QListWidget
QStackedLayout
Widget1
QPushButton
Widget2
QLabel
Widget3
QLineEdit
 QHBoxLayout *layout=new QHBoxLayout;
   
    //创建一个列表
    QListWidget listWidget(&widget);
    listWidget.setMinimumWidth(150);
    listWidget.setFont(QFont("宋体",14));
    listWidget.addItem("QPushButton");
    listWidget.addItem("QLabel");
    listWidget.addItem("QLineEdit");
   
    //新建 3 个窗口,分别放置文本框、按钮和单行输入框
    QWidget widget1;
    widget1.setMinimumSize(400,400);
    QPushButton but1("这是一个按钮",&widget1);
    QWidget widget2;
    widget2.setMinimumSize(400,400);
    QLabel lab1("这是一个文本框",&widget2);
    QWidget widget3;
    widget3.setMinimumSize(400,400);
    QLineEdit edit("这是一个单行输入框",&widget3);
   
    //创建一个分组布局,将 3 个窗口添加到分组控件中
    QStackedLayout *stackedLayout = new QStackedLayout;
    stackedLayout->addWidget(&widget1);
    stackedLayout->addWidget(&widget2);
    stackedLayout->addWidget(&widget3);
   
    //layout 第一列添加 QListWidget 控件,第二列添加分组布局控件,设置它们的伸缩系数比为 1:4
    layout->addWidget(&listWidget,1);
    layout->addLayout(stackedLayout,4);
    //将 layout 水平布局控件添加到 widget 窗口中
    widget.setLayout(layout);
    widget.show();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值