Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

SplitContainer

继承: Container < Control < CanvasItem < Node < Object

派生: HSplitContainer, VSplitContainer

将两个子控件垂直或水平排列的容器,提供了用于调整它们之间分隔比例的抓取器。

描述

用于水平或垂直排列子控件的容器,还会在它们之间创建抓取器。可以拖动抓取器来改变子控件之间的大小关系。

教程

属性

bool

collapsed

false

bool

drag_area_highlight_in_editor

false

int

drag_area_margin_begin

0

int

drag_area_margin_end

0

int

drag_area_offset

0

bool

drag_nested_intersections

false

DraggerVisibility

dragger_visibility

0

bool

dragging_enabled

true

int

split_offset

0

PackedInt32Array

split_offsets

PackedInt32Array(0)

bool

touch_dragger_enabled

false

bool

vertical

false

方法

void

clamp_split_offset(priority_index: int = 0)

Control

get_drag_area_control()

Array[Control]

get_drag_area_controls()

主题属性

Color

touch_dragger_color

Color(1, 1, 1, 0.3)

Color

touch_dragger_hover_color

Color(1, 1, 1, 0.6)

Color

touch_dragger_pressed_color

Color(1, 1, 1, 1)

int

autohide

1

int

minimum_grab_thickness

6

int

separation

12

Texture2D

grabber

Texture2D

h_grabber

Texture2D

h_touch_dragger

Texture2D

touch_dragger

Texture2D

v_grabber

Texture2D

v_touch_dragger

StyleBox

split_bar_background


信号

drag_ended() 🔗

用户结束拖拽时发出。


drag_started() 🔗

用户开始拖拽时发出。


dragged(offset: int) 🔗

当用户拖动任意拖动器时发出。


枚举

enum DraggerVisibility: 🔗

DraggerVisibility DRAGGER_VISIBLE = 0

autohidefalse 时,拆分拖动器始终可见,否则仅在鼠标在拖动器上悬停时可见。

抓取器图标的大小决定了最小间隔 separation

抓取器图标如果比拆分条长,就会自动隐藏。

DraggerVisibility DRAGGER_HIDDEN = 1

拆分拖动器图标始终不可见,无视 autohide 的值。

抓取器图标的大小决定了最小间隔 separation

DraggerVisibility DRAGGER_HIDDEN_COLLAPSED = 2

拆分拖动器图标不可见,拆分条粗细折叠为零。


属性说明

bool collapsed = false 🔗

  • void set_collapsed(value: bool)

  • bool is_collapsed()

如果为 true,则会禁用拖动器,子节点会根据所有 split_offsets 都为 0 时的情况来调整大小。


bool drag_area_highlight_in_editor = false 🔗

  • void set_drag_area_highlight_in_editor(value: bool)

  • bool is_drag_area_highlight_in_editor_enabled()

高亮拖动区域 Rect2,便于在开发时查看位置。dragging_enabledtrue 时拖动区域为金色,为 false 时则为红色。


int drag_area_margin_begin = 0 🔗

  • void set_drag_area_margin_begin(value: int)

  • int get_drag_area_margin_begin()

减少可拖动区域和拆分条 split_bar_background 在容器起始侧的大小。


int drag_area_margin_end = 0 🔗

  • void set_drag_area_margin_end(value: int)

  • int get_drag_area_margin_end()

减少可拖动区域和拆分条 split_bar_background 在容器结尾侧的大小。


int drag_area_offset = 0 🔗

  • void set_drag_area_offset(value: int)

  • int get_drag_area_offset()

将拖动区域在容器轴向上进行偏移,防止拖动区域与 ScrollBar 或其他子节点的可选中 Control 发生重叠。


bool drag_nested_intersections = false 🔗

  • void set_drag_nested_intersections(value: bool)

  • bool is_dragging_nested_intersections()

在两个 SplitContainer 的拖动器交界处添加额外的拖动器,以允许同时拖动两者。必须将两个 SplitContainer 的该属性都设置为 true,且其中一个必须是另一个的子节点(后代)。它们还必须是正交的(它们的 vertical 属性不同),并且后代节点必须紧邻祖先节点的至少一个拖动器(在 minimum_grab_thickness 范围内)。


DraggerVisibility dragger_visibility = 0 🔗

决定拖动器是否可见。该属性无法决定拖动器是否启用,这一需求请使用 dragging_enabled


bool dragging_enabled = true 🔗

  • void set_dragging_enabled(value: bool)

  • bool is_dragging_enabled()

启用或禁用拆分拖拽。


int split_offset = 0 🔗

  • void set_split_offset(value: int)

  • int get_split_offset()

已弃用: Use split_offsets instead. The first element of the array is the split offset between the first two children.

split_offsets 的第一个元素。


PackedInt32Array split_offsets = PackedInt32Array(0) 🔗

每个拖动器的偏移量,单位为像素。每个都是拖动器前后 Control 节点分割的偏移量,0 为默认位置。默认位置基于 Control 节点的扩展标志和最小大小。请参阅 Control.size_flags_horizontalControl.size_flags_verticalControl.size_flags_stretch_ratio

如果拖动器前面的所有 Control 节点都没有扩展,则默认位置位于 SplitContainer 的起始位置。如果拖动器后面的所有 Control 节点都没有扩展,则默认位置位于 SplitContainer 的末尾。如果拖动器位于两个已扩展的 Control 节点之间,则默认位置将位于中间,具体位置取决于 Control.size_flags_stretch_ratio 和最小大小。

注意:如果分割偏移量导致 Control 节点重叠,则在确定位置时将优先使用第一个分割。

Note: The returned array is copied and any changes to it will not update the original property value. See PackedInt32Array for more details.


bool touch_dragger_enabled = false 🔗

  • void set_touch_dragger_enabled(value: bool)

  • bool is_touch_dragger_enabled()

如果为 true,则会启用适合触控的拖动手柄,方便在小尺寸屏幕上使用。与标准抓取器不同,这个拖动手柄与 SplitContainer 的子节点存在重叠,不会影响它们的最小间隔。启用该选项时不再绘制标准抓取器。


bool vertical = false 🔗

  • void set_vertical(value: bool)

  • bool is_vertical()

如果为 true,则该 SplitContainer 会垂直排列其子代,而不是水平排列。

在使用 HSplitContainerVSplitContainer 时无法改变。


方法说明

void clamp_split_offset(priority_index: int = 0) 🔗

钳制 split_offsets 的值以确保它们位于有效范围内且彼此不重叠。重叠时该方法会通过将所有重叠的分割偏移量钳制到该范围,以优先考虑某个分割偏移量(位于索引 priority_index 处)。


Control get_drag_area_control() 🔗

已弃用: Use the first element of get_drag_area_controls() instead.

返回拖拽区域 Control。例如你可以把一个预先配置好的按钮放到拖拽区域 Control 中,这样这个按钮就会跟随拆分条移动。调用 reparent() 前请尝试将 Button 的锚点设置为 center

$BarnacleButton.reparent($SplitContainer.get_drag_area_control())

注意:拖拽区域 Control 绘制在 SplitContainer 的子节点之上,因此 Control 调用 CanvasItem 绘制方法所绘制的内容和添加至 Control 的子节点也会显示在 SplitContainer 的子节点之上。如果需要阻止鼠标拖动,请尝试将自定义子节点的 Control.mouse_filter 设置为 Control.MOUSE_FILTER_IGNORE

警告:这是必要的内部节点,将其移除或释放都可能造成崩溃。


Array[Control] get_drag_area_controls() 🔗

返回拖拽区域 ControlArray。这些是每个子节点之间可交互的 Control 节点。例如,可以使用该方法将预配置的按钮添加到拖拽区域 Control,使其随分割条一起移动。尝试在调用 Node.reparent() 之前将 Button 的锚点设置为 center

$BarnacleButton.reparent($SplitContainer.get_drag_area_controls()[0])

注意:拖拽区域 Control 绘制在 SplitContainer 的子级之上,因此从拖拽区域调用的 CanvasItem 绘制对象以及添加到它的子对象也会出现在 SplitContainer 的子级之上。如果需要,可以尝试将自定义子级的 Control.mouse_filter 设置为 Control.MOUSE_FILTER_IGNORE 以防止阻止鼠标拖动。

警告:这些是必要的内部节点,将其移除或释放都可能造成崩溃。


主题属性说明

Color touch_dragger_color = Color(1, 1, 1, 0.3) 🔗

触摸拖动器的颜色。


Color touch_dragger_hover_color = Color(1, 1, 1, 0.6) 🔗

触摸拖动器悬停状态的颜色。


Color touch_dragger_pressed_color = Color(1, 1, 1, 1) 🔗

触摸拖动器按下状态的颜色。


int autohide = 1 🔗

布尔值。如果为 1true),则当抓取器不在光标下方时会自动隐藏。如果为 0false),则抓取器始终可见。dragger_visibility 必须设置为 DRAGGER_VISIBLE


int minimum_grab_thickness = 6 🔗

拆分条上用户可点击抓取区域的最小厚度。能够确保拆分条在 separationh_grabber / v_grabber 过窄、难以选中时仍然可以拖动。


int separation = 12 🔗

拆分条的粗细,即容器中每个子节点的间隙。如果 dragger_visibilityDRAGGER_VISIBLE 或者为 DRAGGER_HIDDEN 的同时 separation 比抓取器图标相应方向的大小要小,这个粗细就会被抓取器图标的大小覆盖。

注意:如果要让 separation 比抓取器图标大小要小,例如想要设成 1 px 的细线,请将 h_grabberv_grabber 设为新的 ImageTexture,这样就把抓取器图标的大小设为了 0 px


Texture2D grabber 🔗

用于在分隔条绘制的抓取器的图标。仅在 HSplitContainerVSplitContainer 中使用。对于 SplitContainer,见 h_grabberv_grabber


Texture2D h_grabber 🔗

verticalfalse 时绘制在分隔条的抓取器图标。


Texture2D h_touch_dragger 🔗

touch_dragger_enabledtrueverticalfalse 时拖拽手柄所使用的图标。


Texture2D touch_dragger 🔗

touch_dragger_enabledtrue 时用于拖放手柄的图标。仅在 HSplitContainerVSplitContainer 中使用。对于 SplitContainer,见 h_touch_draggerv_touch_dragger


Texture2D v_grabber 🔗

verticaltrue 时绘制在分隔符的抓取器图标。


Texture2D v_touch_dragger 🔗

touch_dragger_enabledtrueverticaltrue 时拖拽手柄所使用的图标。


StyleBox split_bar_background 🔗

决定拆分条厚度大于零时的背景。