一、简介
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加入到某个布局中时,布局会完成如下动作:
- 所有的widgets都将根据各自的QWidget::sizePolicy()和QWidget::sizeHint()分配空间。
- 如果某个widget设置了拉伸因子,且其值大于零,那么将按照其拉伸因子的比例分配空间。
- 如果某个widget的拉伸因子等于零,则只有在其他widget不需要空间的时候才会占据这部分空间(首先使用扩展尺寸策略将空间分配给widgets)。
- 若空间小于某widget的minimum size(最小尺寸)时,会按照这个最小尺寸分配。如果未指定minimumSize则根据minimumSizeHint分配最小空间。(备注:widgets不必具有最小尺寸或最小尺寸提示,在这种情况下,拉伸因子是其决定因素。)
- 若空间大于某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中
-
没有设置拉伸因子的效果
-
设置拉伸因子的效果