设置SEditableText小部件的回调以保存文本

时间:2019-05-03 18:47:56

标签: unreal-engine4

我已经在我的编辑器插件中实现了SEditableText小部件,但是我无法找到一种合理的方式来访问小部件中的值。我知道有一个SEditableText.OnTextChanged()函数,但我看不到要覆盖它或设置自己的回调。是否有将SEditableText的内容保存到变量的标准方法?

我在FModeToolKit的上下文中工作,不确定是否有帮助。

1 个答案:

答案 0 :(得分:0)

实例化slate小部件时,您应该已经在调用SNew。作为属性初始化程序链列表的一部分,初始化SEditableText::OnTextChanged并使用BIND_UOBJECT_DELEGATE绑定到您的容器UObject。委托人签名应为FOnTextChanged。您的处理程序将收到一个FText,可以根据需要将其存储在变量中。

示例:

SEditableText EditableText = SNew(SEditableText)
   .OnTextChanged(BIND_UOBJECT_DELEGATE(FOnTextChanged, OnTextChanged);

然后:

void UMyUObject::HandleOnTextChanged(const FText& InText)
{
   // Do something with text
}

UEditableText::RebuildWidget(EditableText.cpp:50,v4.22.1)中进行实际操作。

NB。我知道您特别询问过OnTextChanged,但也考虑过OnTextComitted;仅在slate小部件失去焦点时才会触发。

啊; BIND_UOBJECT_DELEGATE在UMG中。但是,该宏只是创建可以绑定到的UObject的助手:

#define BIND_UOBJECT_DELEGATE(Type, Function) \
Type::CreateUObject( this, &ThisClass::Function )

因此,有两个选项,要么使用<my type>::CreateUObject,要么可以通过共享指针进行绑定。在我脑海中,SP方法应该看起来像


编辑(基于评论): 如果您未链接UMG,则可以尝试根据UMG中SlateWrapperTypes中定义的宏手动创建UObject:

   #define BIND_UOBJECT_DELEGATE(Type, Function) \
    Type::CreateUObject( this, &ThisClass::Function )

要改为使用共享指针,语法应遵循以下几行:

 auto OnTextChangedSP = FOnTextChanged::CreateSP(this, &MyClass::MyOnTextChangedHandler);
 SEditableText EditableText = SNew(SEditableText)
     .OnTextChanged(OnTextChangedSP);