1、layout介绍
Qt提供一个layout系统,这个系统可以对一个窗口内的子控件进行自动排列,合理安排这些控件的布局。layout系统实际上采用的是组合设计模式。类图如下:
通常需要为最顶层窗口指定一个layout对象。顶层窗口对象通过调用setGeometry()接口函数来对窗口内的控件布局进行刷新。
2、Qt内置的layout类
(1)QHBoxLayout:实现控件单行布局
(2) QVBoxLayout:实现控件单列布局
(3)QGridLayout:实现控件在二维网格中的布局,一个控件可以占据多行多列。
3、子控件(widget)及子布局如何影响整体布局
(1)sizeHint()成员函数为父layout提供本控件(或布局)最佳尺寸信息,供父layout对所有控件进行排布。
(2)
maximumSize
()成员函数为父layout提供本控件(或布局)的最大值信息,本控件(或布局)分配到的空间不会比最大值还要大。
(3)
minimumSize
()成员函数为父layout提供本控件(或布局)的最小值信息,本控件(或布局)分配到的空间不会比最小值还要小。
(4)
hasHeightForWidth
() 成员函数指示本控件(或布局)的高度值是否依赖于宽度值。
heightForWidth
(int)成员函数根据输入的宽度值计算出本控件(或布局)的高度值。
(5)
expandingDirections
() 成员函数指示本控件(或布局)可沿哪个方向获取额外空间。
Qt::Vertical
表示可以沿垂直方向获取额外空间,
Qt::Horizontal
指示可沿水平方向获取额外空间。这两个枚举值可以通过组合来表示控件(或布局)可沿两个方向进行扩展。
4、layout成员函数说明
(1)
setSizeConstraint
(QLayout::SizeConstraint)成员函数设置包含layout对象的控件(widget)调整尺寸的方式。
1)QLayout::SetDefaultConstraint:表示除非控件已经设置了最小值,否则控件的最小值为
minimumSize
()的返回值。
2)QLayout::SetFixedSize:表示将控件的尺寸固定为sizeHint()成员函数返回值。控件不支持缩放。
3)QLayout::SetMinimumSize:表示将控件的最小值设置为
minimumSize
()的返回值。控件尺寸不能比
minimumSize
()返回值更小。
4)QLayout::SetMaximumSize:表示将控件的最大值设置为maximumSize()的返回值。控件尺寸不能比maximumSize()返回值更大。
5)QLayout::SetMinAndMaxSize:表示将控件的最大值设置为maximumSize()的返回值。将控件的最小值设置为
minimumSize
()的返回值。
6)QLayout::SetNoConstraint:表示不对控件缩放进行限制。
(2)
addItem
(QLayoutItem *
item
) 成员函数向layout对象中追加子布局。或其他QLayoutItem派生类对象。
(3)
addWidget
(QWidget *
w
)成员函数向layout对象中追加子控件。
(4)
itemAt
(int
index
)成员函数获取对应于index索引的子对象。
(5)
takeAt
(int
index
) 成员函数返回对应于index索引的子对象,同时将子对象移除。
(6)
parentWidget
() 成员函数返回layout所属的父控件。如果layout对象是一个子布局,那么这个成员函数返回它父layout对象所属的控件。
(7)
setSpacing
(int)成员函数用于设置子控件(布局)之间的间距。
(8)
setContentsMargins
(const QMargins &
margins
)成员函数用于设置环绕在布局对象周围的边界距离。
5、如何决定控件(widget)缩放方式
(1)如果一个控件设置了layout对象,则layout对象的QLayout::SizeConstraint属性决定了控件缩放方式。
(2)如果一个控件没有设置layout对象,则控件的
QSizePolicy
属性决定了控件的缩放方式6、控件(widget)手动布局方式
如果一个控件没有安装layout对象,则他需要重写
QWidget::resizeEvent
() 虚函数,并手动调用每个子控件的
setGeometry
() 来刷新布局。
7、如何写一个自定义layout类
(1)定义一个容器类型的成员变量来承载子对象。
(2)重写
addItem
()虚函数,来实现像layout对象追加子对象
(3)重写
setGeometry
()虚函数,实现对子对象进行布局。
(4)
重写sizeHint
()虚函数,来提供布局对象的最优值信息。这个值用于为父对象进行布局时提供信息。
(5)重写
itemAt
()虚函数,用来获取子对象。
(6)重写
takeAt
()虚函数,用来移除子对象。