Qt自学之路(四)-layout

  • Post author:
  • Post category:其他


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

()虚函数,用来移除子对象。



版权声明:本文为qq_30574227原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。