UE4笔记---Slate控件中的代理事件如何绑定UObject方法


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"))

说明:
OnClicked 为按钮点击代理。
OnCloseButtonClicked() 为按钮点击事件处理的方法。
FReply OnCloseButtonClicked(); 为 OnCloseButtonClicked() 的定义, 以FReply 为返回值。


Visibility 为此按钮是否显示。
GetCloseButtonVisibility() 按钮是否显示的方法。
EVisibility GetCloseButtonVisibility() const; 方法的定义



这些就是在Slate中绑定方法的格式,其他控件都是大同小异的,不清楚就查UE的源码。
上面的代码来自于 STutorialContent.h STutorialContent.cpp 中。



二、 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::Create(TAttribute::FGetter::CreateUObject(this, &UUMGShoppingCart::OnStoreListButtonVisibility, GoodsStyleID))
其实你看下 BIND_UOBJECT_ATTRIBUTE 宏定义 就是上面的代码。
定义在 SlateWrapperTypes.h 方法中


#define BIND_UOBJECT_ATTRIBUTE(Type, Function) \
	TAttribute::Create( TAttribute::FGetter::CreateUObject( this, &ThisClass::Function ) )

EVisibility OnStoreListButtonVisibility(int32 InStyelID); 方法的定义。




你可能感兴趣的:(UE4学习笔记)