UE4笔记---Slate控件中的代理事件如何绑定UObject方法
本示例以 SButton 为例
一、Slate 中的事件绑定
在继承自 SCompoundWidget 的自定义类中
SButton 绑定的方式为:
SNew(SButton)
.ToolTipText(LOCTEXT("QuitStandaloneTooltip", "Close this Message"))
.OnClicked(this, &STutorialContent::OnCloseButtonClicked)
.Visibility(this, &STutorialContent::GetCloseButtonVisibility)
.ButtonStyle(&FEditorStyle::Get().GetWidgetStyle("Tutorials.Content.Button"))
二、 Slate 中的这些代理如何绑定UObject的方法?
在项目开发中,UI的大的框架会用UMG来搭建,内容可能会用Slate实现。
这样就涉及到上面所说的代理和方法的绑定。这些方法都是UObject的方法。
那就秀一段自己写的代码(大侠勿喷呀) 同样以 SButton 为例
SNew(SButton)
.OnClicked(FOnClicked::CreateUObject(this, &UUMGShoppingCart::OnClickedStoreList, GoodsStyleID))
.ButtonStyle(FCustomSlateStyle::Get(), "SimpleSharpButton")
.Visibility(TAttribute::Create(TAttribute::FGetter::CreateUObject(this, &UUMGShoppingCart::OnStoreListButtonVisibility, GoodsStyleID)))
//.Visibility(BIND_UOBJECT_ATTRIBUTE(EVisibility, OnStoreListButtonVisibility))
说明:
OnClicked 同样为按钮点击代理。
FOnClicked::CreateUObject(this, &UUMGShoppingCart::OnClickedStoreList, GoodsStyleID)
这样就是绑定UObject方法, GoodsStyleID 类型为 int32, 这样写就是在这个代理方法触发是传递一个参数到调用的方法中。
FReply OnClickedStoreList(int32 InStyelID); 方法的原型与上面的Slate绑定方法类似,只是多了一个参数。
如果你在开发中不需要传递参数,那就把去掉方法中的参数,在 OnClicked 代理绑定时不用写传入额外的参数即可。
Visibility 同样为此按钮是否显示,两种写法。
一、不需要传入参数时可以使用 BIND_UOBJECT_ATTRIBUTE 宏来实现,就是上面注释掉代码.
.Visibility(BIND_UOBJECT_ATTRIBUTE(EVisibility, OnStoreListButtonVisibility))
通过 BIND_UOBJECT_ATTRIBUTE(EVisibility, OnStoreListButtonVisibility) 来绑定 OnStoreListButtonVisibility() 方法。
二、如果需要传入参数时,在使用 BIND_UOBJECT_ATTRIBUTE 宏就不能完成需求啦,就需要使用
TAttribute
其实你看下 BIND_UOBJECT_ATTRIBUTE 宏定义 就是上面的代码。
定义在 SlateWrapperTypes.h 方法中
#define BIND_UOBJECT_ATTRIBUTE(Type, Function) \
TAttribute::Create( TAttribute::FGetter::CreateUObject( this, &ThisClass::Function ) )