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

发表于2018-01-26
评论0 3.6k浏览
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<FButtonStyle>("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<EVisibility>::Create(TAttribute<EVisibility>::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 同样为此按钮是否显示,两种写法。
1. 不需要传入参数时可以使用 BIND_UOBJECT_ATTRIBUTE 宏来实现,就是上面注释掉代码。
.Visibility(BIND_UOBJECT_ATTRIBUTE(EVisibility, OnStoreListButtonVisibility))
通过 BIND_UOBJECT_ATTRIBUTE(EVisibility, OnStoreListButtonVisibility) 来绑定 OnStoreListButtonVisibility() 方法。

2. 如果需要传入参数时,在使用 BIND_UOBJECT_ATTRIBUTE 宏就不能完成需求啦,就需要使用
TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateUObject(this, &UUMGShoppingCart::OnStoreListButtonVisibility, GoodsStyleID))
其实你看下 BIND_UOBJECT_ATTRIBUTE 宏定义 就是上面的代码。
定义在 SlateWrapperTypes.h 方法中
#define BIND_UOBJECT_ATTRIBUTE(Type, Function) \  
    TAttribute<Type>::Create( TAttribute<Type>::FGetter::CreateUObject( this, &ThisClass::Function ) )  

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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引