Qt:15.布局管理器(QVBoxLayout-垂直布局、QHBoxLayout-水平布局、QGridLayout-网格布局、拉伸系数,控制控件显示的大小)

目录

一、QVBoxLayout-垂直布局:

1.1QVBoxLayout介绍:

[1.2 属性介绍:](#1.2 属性介绍:)

1.3细节理解:

二、QHBoxLayout-水平布局:

三、QGridLayout-网格布局:

3.1QGridLayout介绍:

3.2常用方法:

四、拉伸系数,控制控件显示的大小:

4.1拉伸系数介绍:

4.2水平拉伸-控件的宽度:

4.3控件的大小策略:

4.4垂直拉伸-控件的高度:


一、QVBoxLayout-垂直布局:

1.1QVBoxLayout介绍:

  • QVBoxLayout 是Qt中的一个布局管理器。
  • 用于将子控件垂直排列。它会自动调整子控件的大小和位置,使它们在垂直方向上依次排列,占据可用的空间。
  • 将控件添加到布局管理器:layout->addWidget(控件名);
  • 将布局管理器挂到对象树:this->setLayout(layout_1);
  • 将布局管理器添加到布局管理器:layout_1->addLayout(layout_2);

1.2 属性介绍:

|----------------------|---------------------------------------------------------------------------------------------------|
| layoutLeftMargin | * 设置布局左侧的边距。 * 获取当前左边距:layout->contentsMargins().left() |
| layoutTopMargin | * 设置布局顶部的边距。 * 获取当前顶部边距:layout->contentsMargins().top() |
| layoutRightMargin | * 设置布局右侧的边距。 * 获取当前右边距:layout->contentsMargins().right() |
| layoutBottomMargin | * 设置布局底部的边距。 * 获取当前底部边距:layout->contentsMargins().bottom() |
| layoutSpacing | * 设置子控件之间的间距。 * 获取当前间距:layout->spacing() * 设置间距:layout->setSpacing(spacing) |
| layoutStretch | * 设置子控件的伸缩因子。 * 设置伸缩因子:layout->setStretch(index, stretch) * 获取当前伸缩因子:layout->stretch(index) |
| layoutSizeConstraint | * 设置布局的尺寸约束。 * 获取当前尺寸约束:layout->sizeConstraint() * 设置尺寸约束:layout->setSizeConstraint(constraint) |

1.3细节理解:

  • 一个Widget只能创建一个布局管理器。
  • 通过代码创建的布局管理器,调整窗口的大小,里面的控件也会随之拉伸。
  • 通过ui界面可以创建多个布局管理器,但是创建多余一个的布局管理器前,会先创建一个Widget,此时拉申程序的窗口,控件不会随着伸缩。

二、QHBoxLayout-水平布局:

  • QHBoxLayout 是Qt中的一个布局管理器。
  • 用于将子控件水平排列。它会自动调整子控件的大小和位置,使它们在水平方向上依次排列,占据可用的空间。
  • 属性和垂直布局相同。

三、QGridLayout-网格布局:

3.1QGridLayout介绍:

  • QGridLayout 是 Qt 中的一种布局管理器,用于在网格中排列子控件。它允许在特定的行和列中添加控件或其他布局。

3.2常用方法:

|------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| void addLayout(QLayout *layout, int row, int column) | * 将子布局添加到特定位置 * layout:要添加的子布局。 * row:子布局所在的行。 * column:子布局所在的列。 |
| void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan) | * 将子布局添加到特定位置,并指定行跨度和列跨度 * layout:要添加的子布局。 * row:子布局起始行。 * column:子布局起始列。 * rowSpan:子布局占用的行数。 * columnSpan:子布局占用的列数。 |

四、拉伸系数,控制控件显示的大小:

4.1拉伸系数介绍:

  • 通过代码创建的控件,将它添加到布局管理器后,他们的大小是均等的。
  • 如果要创建出大小不同的控件,就需要通过拉伸系数设置控件。
  • 拉伸系数就相当于设置控件之间的比例。

4.2水平拉伸-控件的宽度:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建6个按钮
    QPushButton* b1=new QPushButton("1");
    QPushButton* b2=new QPushButton("2");
    QPushButton* b3=new QPushButton("3");
    QPushButton* b4=new QPushButton("4");
    QPushButton* b5=new QPushButton("5");
    QPushButton* b6=new QPushButton("6");

    //创建一个网格布局控制器,并将6个按钮分为两行,每行三个
    QGridLayout* layout=new QGridLayout();
    layout->addWidget(b1,0,0);
    layout->addWidget(b2,0,1);
    layout->addWidget(b3,0,2);
    layout->addWidget(b4,1,0);
    layout->addWidget(b5,1,1);
    layout->addWidget(b6,1,2);

    //设置拉伸系数
    this->setLayout(layout);
    layout->setColumnStretch(0,1);
    layout->setColumnStretch(1,3);
    layout->setColumnStretch(2,5);

}
  • 如果将拉伸系数设为0,那么对应列的控件的水平宽度是一个固定值,不再参与比例拉伸。
  • 设置水平拉伸因子:layout->setColumnStretch(column,stretch);

4.3控件的大小策略:

  • 在 Qt 中,控件的大小策略(QSizePolicy)定义了控件在布局管理器中的行为方式,包括如何在水平和垂直方向上拉伸和收缩。默认情况下,控件的 QSizePolicy 会影响它们在布局中的拉伸和缩放行为。
  • 每个控件在创建时都有一个默认的 QSizePolicy。QSizePolicy 包含两个主要属性:水平策略和垂直策略。
  • 不同控件可能有不同的默认策略。
  • QSizePolicy 主要有以下几种常见的策略:
  • QSizePolicy::Fixed:控件的大小是固定的,不会改变。
  • QSizePolicy::Minimum:控件可以收缩到比推荐的大小更小,但不会拉伸。
  • QSizePolicy::Maximum:控件可以拉伸到比推荐的大小更大,但不会收缩。
  • QSizePolicy::Preferred:控件会根据其推荐的大小进行调整,但可以在必要时拉伸或收
  • 缩。
  • QSizePolicy::Expanding:控件会尽可能地拉伸以填充可用空间。
  • QSizePolicy::Ignored:控件的大小不受其内容或推荐大小的影响,可以任意调整。

4.4垂直拉伸-控件的高度:

  • label的水平拉伸默认策略为QSizePolicy::Expanding,但是他的垂直拉伸的默认策略是QSizePolicy::Fixed。
  • 如果想要和水平拉伸一样自由拉伸,就要手动设置label的拉伸策略为QSizePolicy::Expanding。
  • 下面通过两个图片对比设置拉伸策略后的差异:
  • 当垂直方向可以自由拉伸之后。就可以设置比例拉伸了。
  • 设置垂直拉伸因子:layout->setRowStretch(column,stretch);
相关推荐
Oneforlove_twoforjob21 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
engchina37 分钟前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
向宇it37 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
诚丞成1 小时前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
Smile灬凉城6661 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
lsx2024061 小时前
SQL MID()
开发语言
Dream_Snowar1 小时前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶2 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
鸿蒙自习室2 小时前
鸿蒙UI开发——组件滤镜效果
开发语言·前端·javascript
言、雲2 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库