Bootstrap Chameleon Logo

Change Slate though python

修改界面

这里说的修改和获取界面,指定是界面中的具体内容,而非界面控件本身。也提到过SWidget对象是纯C++对象,它在Python中没有对应的对象(Python object)可以获取或者访问。在TAPython中所有对界面的操作都是通过ChameleonData来实现的

修改内容

例如上面例子中的chameleon_gallery.data.set_text(aka_name="IsPythonReadyText", text="Some Changed text"),我们通过变量aka_name指定控件名,然后把新的文本传入。

CAUTION
注意不要再非主线程中修改界面。比如threading.Thread(target=target_slate),在另外一个线程中修改界面内容是不允许的。会触发UE的 SLATE_CROSS_THREAD_CHECK

注意2

  • aka_name 在单个ChameleonTool中是需要是唯一的
  • 设置控件内容时,无需关系控件类型

    • 比如,我们可以通过set_text给STextBlock设置文本内容,也可以为SButton这是文本内容。实际上STextBlock,SEditableText,SEditableTextBox,SMultiLineEditableText,SMultiLineEditableTextBox,SButton 等都可以通过这个set_text来设置文本
    • 再如,set_float_value同时支持对"SSlider"和"SSpinBox"控件

操纵控件

除了获取和修改内容,我们也为部分可交互的控件提供了相应的API,比如我们可以通过scroll_toSMultiLineEditableTextBox滚动到我们所需要的位置

类似的还有: - set_scroll_box_offset

TIP
ScrollTo function, for scrolling the scroll bar to the specified location

控制界面显隐

Unreal编辑器界面中,有很多动态的界面,实际是通过开关控件的显隐来实现的。如果做过GamePlayUMG的应该能很直观得理解这一点,我们会在做工具之前把用的的界面都做好,然后界面的切换等操作,实际是在控制显隐(Visibility)

Slate控件的显隐有以下5种

Syntax 可见 占用空间 可点击 子控件可点击
Visible Yes Yes Yes Yes
Collapsed No No No No
Hidden No Yes No No
HitTestInvisible Yes Yes No No
SelfHitTestInvisible Yes Yes No Yes

在上面Visible的5个状态中,"Visible" 和 "Collapsed"是最常用的。所有有简化的调用版本。例如在ObjectDetailset_collapsed控制显隐

set_collapsed

self.data.set_collapsed(self.ui_rightButtonsGroup, bCollapsed)

set_visibility

我们可以通过set_visibility 设置它的状态, 例如Shelf Tool 中就用到它在控制最后一个拖拽框的显隐状态

    self.data.set_visibility(self.ui_drop_at_last_aka, "Collapsed")

其他三个状态都和点击事件的响应有关,通常会用来控制多个Overlay的控件哪个是“激活”状态,哪个响应点击。

例如Shelf Tool中,在用户需要修改按钮下方文字的时候,就去掉文本控件的"HitTestInvisible"状态,使得用户可以拖拽文本光标,反之则由下方的按钮响应用户的点击事件:

self.data.set_visibility(self.get_ui_text_name(i), "HitTestInvisible" if bLock else "Visible" )

其他

除了内容和显隐的修改,我们还可以修改整个工具窗口的大小,位置等等,具体参考其他工具的控制