类型
GtkConstraintLayout
说明 [src]
final class Gtk.ConstraintLayout : Gtk.LayoutManager
implements Gtk.Buildable {
/* No available fields */
}
使用约束来描述插件之间的关系的布局管理器。
GtkConstraintLayout
是一个布局管理器,它使用通过 GtkConstraint
实例表示的插件属性之间的关系来度量和分配插件。
约束是如何工作的
约束是定义插件属性之间关系的对象;你可以阅读 GtkConstraint
类的描述以获得更深入的定义。
通过获取多个约束并使用 GtkConstraintLayout
将它们应用于插件的子级,可以描述复杂的布局策略;应用于子级或父级插件的每个约束都会为每个属性值求解的参数做出全面布局说明。
需要注意的是,布局是由约束的总和定义的;从现有布局中删除子级或约束而不更改剩余约束可能会导致不稳定或无解的布局。
约束有隐式的“读取顺序”;你应该首先从左上角(或在 RTL 语言中从右上角)描述每个子级的每个边缘以及它们与父容器的关系,先水平描述,然后再垂直描述。
具有太少约束的基于约束的布局可能变得“不稳定”,即:有多个解。不稳定布局的行为未定义。
具有冲突约束的基于约束的布局可能是不可解的,并导致不稳定的布局。你可以使用 GtkConstraint:strength
属性 GtkConstraint
来“推动”布局走向解。
GtkConstraintLayout 作为 GtkBuildable
GtkConstraintLayout
实现< a href="iface.Buildable.html">GtkBuildable
接口并且具有自定义“constraints” 元素,该元素允许在 GtkBuilder
UI 文件中描述约束。
指定约束的 UI 定义片段的示例
<object class="GtkConstraintLayout">
<constraints>
<constraint target="button" target-attribute="start"
relation="eq"
source="super" source-attribute="start"
constant="12"
strength="required" />
<constraint target="button" target-attribute="width"
relation="ge"
constant="250"
strength="strong" />
</constraints>
</object>
上面的定义会向 GtkConstraintLayout 添加两个约束
- 在 “button” 的前导边缘和使用约束布局的小工具前导边缘之间加上一个必需约束,再加上 12 个像素
- 一个强约束,使“button”的宽度大于或等于 250 个像素
“target” 和 “target-attribute” 属性是必需的。
“constraint” 元素的 “source” 和 “source-attribute” 属性是可选的;如果未指定,则假定约束是常数。
“relation” 属性是可选的;如果未指定,则假定约束是相等性。
“力量”属性是可选的;如果未指定,约束将被认定为必填项。
“资源”和“目标”属性可以设置为“父”,以表明约束目标是小部件,使用 GtkConstraintLayout。
可以有“常量”和“乘数”属性。
此外,“约束”元素还可以包含由布局使用的 `GtkConstraintGuides` 描述
<constraints>
<guide min-width="100" max-width="500" name="hspace"/>
<guide min-height="64" nat-height="128" name="vspace" strength="strong"/>
</constraints>
“导引”元素具有以下可选属性
- “”“min-width”、“nat-width”以及“max-width”,分别描述导引的最小宽度、自然宽度以及最大宽度
- “”“min-height”、“nat-height”以及“max-height”,分别描述导引的最小高度、自然高度以及最大高度
- “”“strength”描述导引自然大小的约束力量;如果未指定,将认定约束具有中等力量
- “”“name”描述导引的名称,在调试时有用
使用可视格式语言
复杂约束可以使用紧凑的语法描述,称为 VFL 或可视格式语言。
可视格式语言描述一行或一列的所有约束,通常从前缘开始朝后缘结束。布局的每个元素由“视图”组成,这些视图标识 GtkConstraintTarget
。
例如
[button]-[textField]
描述一个约束,它将“按钮”的后缘绑定到“文本字段”的前缘,两者之间留有默认空白。
使用 VFL 还可以指定描述宽度和高度等属性的约束的谓词
// Width must be greater than, or equal to 50
[button(>=50)]
// Width of button1 must be equal to width of button2
[button1(==button2)]
除非另有指定,否则 VFL 描述的默认方向是水平的
// horizontal orientation, default attribute: width
H:[button(>=150)]
// vertical orientation, default attribute: height
V:[button1(==button2)]
还可以指定多个谓词以及它们的强度
// minimum width of button must be 150
// natural width of button can be 250
[button(>=150@required, ==250@medium)]
最后,还可以使用简单的算术运算符
// width of button1 must be equal to width of button2
// divided by 2 plus 12
[button1(button2 / 2 + 12)]
实例方法
继承自 GtkLayoutManager 的方法(6)
gtk_layout_manager_allocate
将给定的 `width`、`height` 和 `baseline` 分配给一个 `widget`,并使用 `manager` 的布局管理策略计算 `widget` 的子项的位置和大小。
gtk_layout_manager_get_layout_child
如果需要,为 GtkLayoutManager
检索一个 GtkLayoutChild
实例,并创建一个实例。
gtk_layout_manager_get_request_mode
检索 manager
的请求模式。
gtk_layout_manager_get_widget
使用给定的 GtkLayoutManager
检索 GtkWidget
。
gtk_layout_manager_layout_changed
如果存在,排入使用 manager
的 GtkWidget
上的调整大小。
gtk_layout_manager_measure
使用 manager
度量 widget
的大小,针对给定的 orientation
和大小。
从 GtkBuildable 继承的方法 (1)
信号
从 GObject 继承的信号 (1)
GObject::notify
当通过 g_object_set_property()、g_object_set() 等设置对象的一个属性值时,该对象上将发出 notify 信号。