我已经在我的编辑器插件中实现了SEditableText小部件,但是我无法找到一种合理的方式来访问小部件中的值。我知道有一个SEditableText.OnTextChanged()函数,但我看不到要覆盖它或设置自己的回调。是否有将SEditableText的内容保存到变量的标准方法?
我在FModeToolKit的上下文中工作,不确定是否有帮助。
答案 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);