Qt Layout

Qt的布局管理系统自动管理widgets的位置和大小,提供QLayout类和多种布局类型如QBoxLayout、QGridLayout等。布局类能处理子widget的尺寸变化、字体变化等情况,支持自定义布局和拉伸因子。此外,还介绍了如何编写自定义布局管理器。
摘要由CSDN通过智能技术生成

一、简介

Qt的布局管理系统使用起来简单方便、功能强大,可以自动的对某个widget下的子widget进行合理化布局,充分的使用所有可用的空间。

Qt有一系列的布局管理类,用来描述在交互界面上这些widgets如果排列。当widgets的位置、大小改变后,这些个布局管理类会自动处理widgets的空间位置、大小,使之可以整齐的排列起来。

所有的QWidget子类都可以使用布局管理类来排列其子widget。调用QWidget::setLayout()函数可以指定该widget使用什么样的布局方式。当某个widget被指定布局时,该布局将会自动的完成如下的动作:

  • 管理子widget的位置
  • 合理地设置windows的默认尺寸
  • 合理地设置windows的最小尺寸
  • 处理窗口尺寸变化
  • 当以下情况发生时,将自动更新
    • 子widget的字体尺寸,文本或其他内容改变时
    • widget隐藏或显示
    • 删除子widget

二、布局类介绍

以下为其一张继承关系图:
在这里插入图片描述

Qt 布局类

  • QLayoutItem(布局中的抽象项目);
  • QSpacerItem(布局中的空白);
  • QWidgetItem(布局中的widget项目);
  • QLayout(布局的基类);
  • QBoxLayout(水平/垂直布局);
  • QHBoxLayout(水平布局);
  • QVBoxLayout(垂直布局);
  • QFormLayout(表单布局);
  • QGridLayout(网格布局);
  • QStackedLayout(堆栈widget,同一时刻只有一个widget可显示);
  • QGraphicsAnchor(在QGraphicsAnchorLayout中表示两个item的锚点
  • QGraphicsAnchorLayout(在Graphics View中一个item链接到widget的锚点的布局);
  • QSizePolicy(布局策略,描述了水平/垂直布局时的策略);
  • QButtonGroup(管理一堆按钮的容器);
  • QGroupBox(有标题的组合框);
  • QStackedWidget(堆栈widget);

使用布局小技巧

当你使用某个布局时,构建widget的时候不需要指定父对象(parent)。layout会自动的为其重新分配父对象。layout不是父对象,widget只能令其他widget作为父对象,不可以将layout作为父对象。

将widgets添加到布局

当你把某个widget加入到某个布局中时,布局会完成如下动作:

  1. 所有的widgets都将根据各自的QWidget::sizePolicy()和QWidget::sizeHint()分配空间。
  2. 如果某个widget设置了拉伸因子,且其值大于零,那么将按照其拉伸因子的比例分配空间。
  3. 如果某个widget的拉伸因子等于零,则只有在其他widget不需要空间的时候才会占据这部分空间(首先使用扩展尺寸策略将空间分配给widgets)。
  4. 若空间小于某widget的minimum size(最小尺寸)时,会按照这个最小尺寸分配。如果未指定minimumSize则根据minimumSizeHint分配最小空间。(备注:widgets不必具有最小尺寸或最小尺寸提示,在这种情况下,拉伸因子是其决定因素。)
  5. 若空间大于某widget的maximum size(最大尺寸)时,会按照这个最大尺寸分配。(widgets不必具有最大尺寸,在这种情况下,拉伸因子是其决定因素。)

拉伸因子

widgets通常是在未设置任何拉伸因子的情况下创建的。当将它们布置在布局中时,将根据其QWidget::sizePolicy()或它们的最小尺寸提示(以较大者为准)为它们分配一定的空间。拉伸因子用于更改彼此之间按比例分配的空间widgets。

void QBoxLayout::addLayout(QLayout *layout, int stretch = 0)
void QBoxLayout::insertLayout(int index, QLayout *layout, int stretch = 0)
void QBoxLayout::addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())
void QBoxLayout::insertWidget(int index, QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())
bool QBoxLayout::setStretchFactor(QWidget *widget, int stretch)
bool QBoxLayout::setStretchFactor(QLayout *layout, int stretch)
// 以上stretch为其拉伸因子,存储在QBoxLayoutItem中
  • 没有设置拉伸因子的效果
    在这里插入图片描述

  • 设置拉伸因子的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值