【Qt】QBoxLayout类详解

00. 目录

01. 概述

QBoxLayout类将子窗口控件水平或垂直排列。

QBoxLayout占用它获取的空间(从其父布局或从parentWidget()),将其划分为一行框,并使每个托管窗口小部件填充一个框内。
在这里插入图片描述
如果QBoxLayout的方向是Qt :: Horizontal,则将这些框以适当的大小放置在一行中。每个小部件(或其他框)将至少获得其最小尺寸,并且至多获得其最大尺寸。任何多余的空间都会根据拉伸因子进行共享(有关更多信息,请参见下文)。
在这里插入图片描述

如果QBoxLayout的方向是Qt :: Vertical,则将这些框放置在一列中,并再次使用适当的大小。

创建QBoxLayout的最简单方法是使用便捷类之一,例如QHBoxLayout(用于Qt :: HorizontalBox)或QVBoxLayout(用于Qt :: VerticalBox)。您还可以直接使用QBoxLayout构造函数,将其方向指定为LeftToRight,RightToLeft,TopToBottom或BottomToTop。

如果QBoxLayout不是顶级布局(即,它不管理小部件的所有区域和子级),则必须先将其添加到其父级布局中,然后才能对其进行任何操作。添加布局的通常方法是调用parentLayout-> addLayout()。

完成此操作后,可以使用以下四个函数之一将框添加到QBoxLayout中:

  • addWidget()将小部件添加到QBoxLayout并设置小部件的拉伸因子。(拉伸因子沿着Box的行。)
  • addSpacing()创建一个空的Box;这是您用来创建美观且宽敞的对话框的功能之一。有关设置边距的方法,请参见下文。
  • addStretch()创建一个空的,可拉伸的框。
  • addLayout()将包含另一个QLayout的框添加到该行,并设置该布局的拉伸因子。

使用insertWidget(),insertSpacing(),insertStretch()或insertLayout()在方框中的指定位置插入一个框。

QBoxLayout还包括两个边距宽度:

  • setContentsMargins()设置小部件每一侧的外边框的宽度。这是沿着QBoxLayout的四个边中的每个保留空间的宽度。
  • setSpacing()设置相邻框之间的宽度。(您可以使用addSpacing()在特定位置获得更多空间。)

样式提供了页边距默认值。大多数Qt样式指定的默认边距对于子窗口小部件为9,对于Windows为11。间距默认与顶层布局的边距宽度相同,或与父布局相同。

要从布局中删除小部件,请调用removeWidget()。在小部件上调用QWidget :: hide()还可以有效地从布局中删除该小部件,直到调用QWidget :: show()为止。

由于它们方便的构造函数,您几乎总是要使用QVBoxLayout和QHBoxLayout而不是QBoxLayout。

02. 公有成员方法

在这里插入图片描述

03. 常用成员方法介绍

水平布局器 QHBoxLayout 和垂直布局器 QVBoxLayout 的基类都是 QBoxLayout,只是二者排列方向不同。水平和垂直布局器的主要功能函数都位于基类 QBoxLayout 里面,我们这里专门介绍一下这个基类的功能。

QBoxLayout 构造函数和 setDirection() 都可以指定布局器的方向:

QBoxLayout(Direction dir, QWidget * parent = 0)
void setDirection(Direction direction)
    
QBoxLayout 布局器的方向 QBoxLayout::Direction 枚举不仅可以指定水平和垂直,还能指定反方向排列:
枚举常量 数值 描述
QBoxLayout::LeftToRight 0 水平布局,从左到右排列
QBoxLayout::RightToLeft 1 水平布局,从右到左排列
QBoxLayout::TopToBottom 2 垂直布局,从上到下排列
QBoxLayout::BottomToTop 3 垂直布局,从下到上排列

水平布局器 QHBoxLayout 和垂直布局器 QVBoxLayout 默认是其中的两种:QBoxLayout::LeftToRight 和 QBoxLayout::TopToBottom 。

布局器是一定要往里面添加控件才有用,添加控件的函数如下:
void addWidget(QWidget * widget, int stretch = 0, Qt::Alignment alignment = 0)
void insertWidget(int index, QWidget * widget, int stretch = 0, Qt::Alignment alignment = 0)
widget 就是要添加的控件指针,stretch 是伸展因子(到 6.5 节再讲这个,本节先不管),伸展因子越大,
窗口变大时拉伸越 多,alignment 一般不需要指定,用默认的即可。第一个 addWidget() 是将控件添加到
布局里面的控件列表末尾,第二个 insertWidget() 
是将控件插入到布局里控件列表序号为 index 的位置。

对于布局器里的各个控件,可以设置相邻控件之间默认的间距:
void setSpacing(int spacing)
spacing 就是间隔的像素点数目。如果不设置 spacing,那么布局器会根据默认策略决定如何添加控件之间的间隙,一般是根据父窗口
或父布局器的策略来 定。

布局器中不仅可以添加控件,还可以直接添加其他布局:
void addLayout(QLayout * layout, int stretch = 0)
void insertLayout(int index, QLayout * layout, int stretch = 0)
参数里添加的 layout 布局器会作为一个整体,与父布局器里其他控件一块排布,stretch 也是伸展因子。

对于 QBoxLayout、QHBoxLayout 、QVBoxLayout 布局器,通常不需要手动新建空白条对象,因为它们自带相关函数:
void QBoxLayout::addSpacing(int size)    //添加 size 固定尺寸空白条到布局器
void QBoxLayout::addStretch(int stretch = 0)  //添加自动拉伸的空白条到布局器
void QBoxLayout::insertSpacing(int index, int size)  //插入 size 固定尺寸空白条到布局器
void QBoxLayout::insertStretch(int index, int stretch = 0)  //插入自动拉伸的空白条到布局器
对于 add* 添加函数,因为布局器内部通常有多个控件,添加函数是把空白条添加到最后。
而 insert* 插入函数,是把空白条插入到指定序号 index 的位置。

如果要添加自己创建的空白条对象,也是可行的:
void addSpacerItem(QSpacerItem * spacerItem)
void insertSpacerItem(int index, QSpacerItem * spacerItem)
另外,还可以自己从 QLayoutItem 派生新的布局器条目,对布局器条目进行自定义,这些新的布局器条目可以用如下函数添加:
virtual void addItem(QLayoutItem * item)
void insertItem(int index, QLayoutItem * item)

讲了如何添加控件和其他布局器,当然也可以计算布局器里面的条目计数:
virtual int count() const
如果要获得布局器中某个序号的条目:
virtual QLayoutItem * itemAt(int index) const
如果要删除布局器中某个序号的条目:
virtual QLayoutItem * takeAt(int index)
布局器中无论是填充普通控件还是其他布局器,每个条目都是用 QLayoutItem 封装的,对于获得的 QLayoutItem 指针(非空指针),
如果要获取里面封装的控件、布局器或空白条,使用如下函数:
QWidget * QLayoutItem::widget()
QLayout * QLayoutItem::layout()
QSpacerItem * QLayoutItem::spacerItem()
注意判断以上函数的返回值是否为 NULL 指针,如果是非空指针才能进行其他操作。

04. 预留

05. 预留

06. 附录

6.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639

© 版权声明
THE END
喜欢就支持一下吧
点赞282 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容