QLayout类是布局管理器的基类。
Header: | #include <QLayout> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake: | QT += widgets |
Inherits: | << QObject and << QLayoutItem |
Inherited By: |
【详细说明】
这是一个由 QBoxLayout, QGridLayout, QFormLayout, QStackedLayout继承的抽象基类。
对于QLayout子类或QMainWindow的用户,很少需要使用QLayout提供的基本功能,例如:setSizeConstraint() or setMenuBar()(参见 Layout Management)。
要创建自己的布局管理器,请实现函数addItem(), sizeHint(), setGeometry(), itemAt() 和 takeAt()。您还应该实现 minimumSize() ,以确保如果空间太小,您的布局不会调整为零大小。
若要支持身高取决于其宽度的子对象,请实现hasHeightForWidth() 和 heightForWidth()。
有关实现自定义布局管理器的详细信息,请参阅示例 Flow Layout。
删除布局管理器时,布局管理将停止。
参见: QLayoutItem, Layout Management, Basic Layouts Example 和 Flow Layout Example。
【公共类型】
enum | SizeConstraint { SetDefaultConstraint, SetFixedSize, SetMinimumSize, SetMaximumSize, SetMinAndMaxSize, SetNoConstraint } |
尺寸模式SizeConstraint参数详解如下:
枚举名称 | 值 | 说明 |
---|---|---|
QLayout::SetDefaultConstraint | 0 | 主 Widget 的最小尺寸设置为 minimumSize(), 除非 Widget 已经是最小尺寸。这是默认的尺寸模式。 |
QLayout::SetFixedSize | 3 | 主 widget 尺寸设置为 sizeHint(),且无法调整大小。 |
QLayout::SetMinimumSize | 2 | 主 widget 的最小尺寸设置为 minimumSize(),不能比这更小。 |
QLayout::SetMaximumSize | 4 | 主 widget 的最大尺寸设置为 maximumSize(),不能比这更大。 |
QLayout::SetMinAndMaxSize | 5 | 主 widget 的最小尺寸设置为 minimumSize() ,并且最大尺寸设置为 maximumSize()。 |
QLayout::SetNoConstraint | 1 | 控件尺寸不受约束。 |
【属性】
- sizeConstraint : SizeConstraint
此属性保存布局的调整尺寸模式,详见上方SizeConstraint枚举。
- spacing : int
此属性保存布局内控件之间的间距。
如果未显式设置任何值,则布局的间距将从父布局或父构件的样式设置继承。
对于QGridLayout 和 QFormLayout,可以使用setHorizontalSpacing() 和 setVerticalSpacing()设置不同的水平和垂直间距。在这种情况下,spacing() 返回 -1。
【公有函数】
构造一个新的顶级 QLayout,其父级为nullptr。 布局直接设置为parent的顶级布局。一个控件只能有一个顶级布局。它由QWidget::layout()返回。 如果parent是nullptr,则必须将此布局插入到另一个布局中,或使用QWidget::setLayout()将其设置为控件的布局。 | QLayout(QWidget *parent = nullptr) |
bool | activate() |
在必要时重做 parentWidget() 的布局。 您通常不需要调用它,因为它是在合适的时机自动调用的。如果重新设置了布局,则返回 true。 | |
virtual void | addItem(QLayoutItem *item) = 0 |
此虚函数从子类中实现,以添加 item 项。它的添加方式特定于每个子类。 此函数通常不会在应用程序代码中调用。要将控件添加到布局中,请使用addWidget()函数,要添加子布局,请使用相关子类提供的 QGridLayout::addLayout()函数。 注意:item 的所有权已转移到布局,布局有责任将其销毁。 | |
void | addWidget(QWidget *w) |
以特定布局的方式将控件添加到此w布局中。此函数使用addItem()。 | |
QMargins | contentsMargins() const |
返回布局周围使用的边距。 默认情况下,使用QLayout样式提供的值。在大多数平台上,所有方向的边距均为 11 像素。 它属性 contentsMargins 的 Getter 函数。 | |
QRect | contentsRect() const |
返回布局的geometry() 矩形,但要考虑内容边距。 | |
virtual int | count() const = 0 |
必须在子类中实现,用以返回布局中的项数。 | |
void | getContentsMargins(int *left, int *top, int *right, int *bottom) const |
对于 left, top, right 和 bottom中的每一个,如果不为nullptr,都将存储指针所引用位置中指定的边距大小。 默认情况下,使用样式提供的值。在大多数平台上,所有方向的边距均为 11 像素。 | |
virtual int | indexOf(const QWidget *widget) const |
在此布局中搜索控件项(不包括子布局)。 返回 widget 的索引,如果未找到,则返回 -1。 在默认实现中,它是使用 itemAt() 遍历所有项目。 | |
virtual int | indexOf(const QLayoutItem *layoutItem) const |
在此布局中搜索布局项(不包括子布局)。 返回 layoutItem 的索引,如果未找到,则返回 -1。 | |
bool | isEnabled() const |
布局可用性检查,可用返回true, 否则返回 false 。 | |
virtual QLayoutItem * | itemAt(int index) const = 0 |
必须在子类中重新实现,用于返回位于index 的布局项。如果没有此类项,则函数必须返回nullptr。项目从 0 开始连续编号。如果删除某个项目,则将对其他项目重新编号。 此函数可用于循环访问布局。以下代码将为控件布局结构中的每个布局项绘制一个矩形。 | |
QWidget * | menuBar() const |
返回为此布局设置的菜单栏,如果未设置菜单栏,则返回nullptr。 | |
QWidget * | parentWidget() const |
返回此布局的父控件,或者如果此布局未从属于任何widget则返回nullptr。 如果布局是子布局,则此函数将返回父布局的父 layout。 | |
void | removeItem(QLayoutItem *item) |
从布局中删除布局项 item 。调用方有责任删除该项目。 注意, item 可以是layout(因为 QLayout继承QLayoutItem)。 | |
void | removeWidget(QWidget *widget) |
从布局中删除控件。在此调用之后,调用者有责任为控件提供合理的形状,或者将控件放回布局中,或者在必要时显式隐藏它。 注意:widget 的所有权与添加时相同。 | |
virtual QLayoutItem * | replaceWidget(QWidget *from, QWidget *to, Qt::FindChildOptions options = Qt::FindChildrenRecursively) |
搜索from控件并在找到时将其替换为to控件。在成功时返回包含此控件的布局项,否则返回nullptr。如果参数包含 请注意,返回的项可能不属于此布局,而是属于子布局。 返回的布局项不再归该布局所有,应将其删除或插入到另一个布局中。 from不再由布局管理,可能需要删除或隐藏。 from控件的父级保持不变。 此函数适用于内置的 Qt 布局,但可能不适用于自定义布局。 | |
bool | setAlignment(QWidget *w, Qt::Alignment alignment) |
将 widget w 的对齐方式设置为alignment,如果在此布局中找到了w,则返回 true(不包括子布局);否则返回 false 。 | |
bool | setAlignment(QLayout *l, Qt::Alignment alignment) |
重载。将 QLayout l 的对齐方式设置为alignment,如果在此布局中找到了 l,则返回 true(不包括子布局);否则返回 false 。 | |
void | setContentsMargins(int left, int top, int right, int bottom) |
设置要在布局周围使用的 left, top, right, and bottom 边距。默认情况下,使用样式提供的值。在大多数平台上,所有方向的边距均为 11 像素。 | |
void | setContentsMargins(const QMargins &margins) |
设置要在 margins 周围使用的边距。默认情况下,使用样式提供的值。在大多数平台上,所有方向的边距均为 11 像素。 | |
void | setEnabled(bool enable) |
如果为 true,则启用此布局,否则禁用它。启用的布局会根据更改动态调整;禁用的布局就像它不存在一样。 默认情况下,所有布局都处于启用状态。 | |
void | setMenuBar(QWidget *widget) |
指示布局管理器将菜单栏放在 parentWidget()的顶部,在 QWidget::contentsMargins()之外。所有子控件都放置在菜单栏的下边缘下方。 | |
void | setSizeConstraint(QLayout::SizeConstraint) |
属性 SizeConstraint的设置函数。 | |
virtual void | setSpacing(int) |
组件间距离属性spacing的设置函数。 | |
QLayout::SizeConstraint | sizeConstraint() const |
布局的调整尺寸模式属性SizeConstraint的访问函数。 | |
virtual int | spacing() const |
布局内控件之间的间距spacing属性的访问函数。 | |
virtual QLayoutItem * | takeAt(int index) = 0 |
必须在子类中重新实现,才能从布局中删除布局项,并返回该项的index。如果没有这样的项,则该函数必须不执行任何操作并返回 0。项目从 0 开始连续编号。如果某个项目被删除,其他项目将被重新编号。 以下代码片段演示了一种从布局中删除所有项的安全方法: | |
void | unsetContentsMargins() |
取消设置布局周围的任何用户定义的边距。布局将使用样式提供的默认值。 这是 contentsMargins 属性的复位器。 | |
void | update() |
刷新parentWidget()布局,用户无需调用,它会在合适时机自动调用。 |
【重新实现的公有函数】
以下函数是其父类虚函数的重载,详见【<< QLayoutItem类】
virtual QSizePolicy::ControlTypes | controlTypes() const override |
virtual Qt::Orientations | expandingDirections() const override |
virtual QRect | geometry() const override |
virtual void | invalidate() override |
virtual bool | isEmpty() const override |
virtual QLayout * | layout() override |
virtual QSize | maximumSize() const override |
virtual QSize | minimumSize() const override |
virtual void | setGeometry(const QRect &r) override |
【静态公有成员】
QSize | closestAcceptableSize(const QWidget *widget, const QSize &size) |
返回一个满足 widget 上的所有大小约束的尺寸,包括 heightForWidth() ,并且该大小尽可能接近size。 |
【受保护函数】
void | addChildLayout(QLayout *childLayout) | 此函数从子类中调用addLayout()或insertLayout()函数,以将布局添加为子布局。 需要直接调用它的唯一方案是实现支持嵌套布局的自定义布局。 |
void | addChildWidget(QWidget *w) | 此函数是从子类中的addWidget()函数中调用的,以添加为布局的托管控件。 如果w已由布局管理,则此函数将生成警告,并从该布局中删除。因此,在添加w到布局的数据结构之前,必须调用此函数。 |
QRect | alignmentRect(const QRect &r) const | 返回此布局的几何图形设置为 r 时应覆盖的矩形,前提是此布局支持 setAlignment()。 结果由 sizeHint() 和 expandingDirections()派生。它永远不会大于 r 。 |