UE4之Slate编程的常见宏
Slate框架结合了声明式语法,并且提供了一套完整的宏来简化声明及创建新控件的过程。下面就来学习一下slate矿建中一些常见的宏:
这些宏声明在以下头文件中:Engine\Source\Runtime\SlateCore\Public\Widgets\DeclarativeSyntaxSuppot.h
SLATE_BEGIN_ARGS(WidgetType):带参宏
Widgets的创建者可以使用SLATE_BEGIN_ARGS和SLATE_END_ARGS来声明和构建一个Widget,使得Widget可以通过SNew()和SAssignNew()来创建一个Widget,从而可以添加到用户视口.
其中参数WidgetType是你正在构建的Widget的类型;
SLATE_BEGIN_ARGS的声明
#define SLATE_BEGIN_ARGS( WidgetType ) \ public: \ struct FArguments : public TSlateBaseNamedArgs<WidgetType> \ { \ typedef FArguments WidgetArgsType; \ FORCENOINLINE FArguments()
SLATE_END_ARGS():无参宏
SLATE_END_ARGS的声明
#define SLATE_END_ARGS() \ };
SLATE_ATTRIBUTE(AttrType,AttrName):
Use this macro to add a attribute to the declaration of your widget.使用这个宏可以为你正在声明的Widget添加一个属性(TAttribute<>类型).
* An attribute can be a value or a function.一个属性可以是一个值或者方法
参数:
AttrType:属性类型,可以是任意数据类型
AttrType:属性名
SLATE_ATTRIBUTE的声
#define SLATE_ATTRIBUTE( AttrType, AttrName ) \
TAttribute< AttrType > _##AttrName; \ WidgetArgsType& AttrName( const TAttribute< AttrType >& InAttribute ) \ { \ _##AttrName = InAttribute; \ return this->Me(); \ } \ \ /* Bind attribute with delegate to a global function * NOTE: We use a template here to avoid 'typename' issues when hosting attributes inside templated classes */ \ template< typename StaticFuncPtr > \ WidgetArgsType& AttrName##_Static( StaticFuncPtr InFunc ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateStatic( InFunc ) ); \ return this->Me(); \ } \ template< typename Var1Type > \ WidgetArgsType& AttrName##_Static( typename TAttribute< AttrType >::FGetter::template TStaticDelegate_OneVar< Var1Type >::FFuncPtr InFunc, Var1Type Var1 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateStatic( InFunc, Var1 ) ); \ return this->Me(); \ } \ template< typename Var1Type, typename Var2Type > \ WidgetArgsType& AttrName##_Static( typename TAttribute< AttrType >::FGetter::template TStaticDelegate_TwoVars< Var1Type, Var2Type >::FFuncPtr InFunc, Var1Type Var1, Var2Type Var2 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateStatic( InFunc, Var1, Var2 ) ); \ return this->Me(); \ } \ template< typename Var1Type, typename Var2Type, typename Var3Type > \ WidgetArgsType& AttrName##_Static( typename TAttribute< AttrType >::FGetter::template TStaticDelegate_ThreeVars< Var1Type, Var2Type, Var3Type >::FFuncPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateStatic( InFunc, Var1, Var2, Var3 ) ); \ return this->Me(); \ } \ template< typename Var1Type, typename Var2Type, typename Var3Type, typename Var4Type > \ WidgetArgsType& AttrName##_Static( typename TAttribute< AttrType >::FGetter::template TStaticDelegate_FourVars< Var1Type, Var2Type, Var3Type, Var4Type >::FFuncPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3, Var4Type Var4 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateStatic( InFunc, Var1, Var2, Var3, Var4 ) ); \ return this->Me(); \ } \ \ /* Bind attribute with delegate to a lambda * technically this works for any functor types, but lambdas are the primary use case */ \ WidgetArgsType& AttrName##_Lambda(TFunction< AttrType(void) >&& InFunctor) \ { \ _##AttrName = TAttribute< AttrType >::Create(Forward<TFunction< AttrType(void) >>(InFunctor)); \ return this->Me(); \ } \ \ /* Bind attribute with delegate to a raw C++ class method */ \ template< class UserClass > \ WidgetArgsType& AttrName##_Raw( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TRawMethodDelegate_Const< UserClass >::FMethodPtr InFunc ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateRaw( InUserObject, InFunc ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type > \ WidgetArgsType& AttrName##_Raw( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TRawMethodDelegate_OneVar_Const< UserClass, Var1Type >::FMethodPtr InFunc, Var1Type Var1 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateRaw( InUserObject, InFunc, Var1 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type > \ WidgetArgsType& AttrName##_Raw( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TRawMethodDelegate_TwoVars_Const< UserClass, Var1Type, Var2Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateRaw( InUserObject, InFunc, Var1, Var2 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type, typename Var3Type > \ WidgetArgsType& AttrName##_Raw( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TRawMethodDelegate_ThreeVars_Const< UserClass, Var1Type, Var2Type, Var3Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateRaw( InUserObject, InFunc, Var1, Var2, Var3 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type, typename Var3Type, typename Var4Type > \ WidgetArgsType& AttrName##_Raw( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TRawMethodDelegate_FourVars_Const< UserClass, Var1Type, Var2Type, Var3Type, Var4Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3, Var4Type Var4 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateRaw( InUserObject, InFunc, Var1, Var2, Var3, Var4 ) ); \ return this->Me(); \ } \ \ /* Bind attribute with delegate to a shared pointer-based class method. Slate mostly uses shared pointers so we use an overload for this type of binding. */ \ template< class UserClass > \ WidgetArgsType& AttrName( TSharedRef< UserClass > InUserObjectRef, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_Const< UserClass >::FMethodPtr InFunc ) \ { \ _##AttrName = TAttribute< AttrType >( InUserObjectRef, InFunc ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type > \ WidgetArgsType& AttrName( TSharedRef< UserClass > InUserObjectRef, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_OneVar_Const< UserClass, Var1Type >::FMethodPtr InFunc, Var1Type Var1 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObjectRef, InFunc, Var1 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type > \ WidgetArgsType& AttrName( TSharedRef< UserClass > InUserObjectRef, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_TwoVars_Const< UserClass, Var1Type, Var2Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObjectRef, InFunc, Var1, Var2 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type, typename Var3Type > \ WidgetArgsType& AttrName( TSharedRef< UserClass > InUserObjectRef, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_ThreeVars_Const< UserClass, Var1Type, Var2Type, Var3Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObjectRef, InFunc, Var1, Var2, Var3 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type, typename Var3Type, typename Var4Type > \ WidgetArgsType& AttrName( TSharedRef< UserClass > InUserObjectRef, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_FourVars_Const< UserClass, Var1Type, Var2Type, Var3Type, Var4Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3, Var4Type Var4 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObjectRef, InFunc, Var1, Var2, Var3, Var4 ) ); \ return this->Me(); \ } \ \ /* Bind attribute with delegate to a shared pointer-based class method. Slate mostly uses shared pointers so we use an overload for this type of binding. */ \ template< class UserClass > \ WidgetArgsType& AttrName( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_Const< UserClass >::FMethodPtr InFunc ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObject, InFunc ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type > \ WidgetArgsType& AttrName( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_OneVar_Const< UserClass, Var1Type >::FMethodPtr InFunc, Var1Type Var1 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObject, InFunc, Var1 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type > \ WidgetArgsType& AttrName( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_TwoVars_Const< UserClass, Var1Type, Var2Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObject, InFunc, Var1, Var2 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type, typename Var3Type > \ WidgetArgsType& AttrName( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_ThreeVars_Const< UserClass, Var1Type, Var2Type, Var3Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObject, InFunc, Var1, Var2, Var3 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type, typename Var3Type, typename Var4Type > \ WidgetArgsType& AttrName( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TSPMethodDelegate_FourVars_Const< UserClass, Var1Type, Var2Type, Var3Type, Var4Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3, Var4Type Var4 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateSP( InUserObject, InFunc, Var1, Var2, Var3, Var4 ) ); \ return this->Me(); \ } \ \ /* Bind attribute with delegate to a UObject-based class method */ \ template< class UserClass > \ WidgetArgsType& AttrName##_UObject( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TUObjectMethodDelegate_Const< UserClass >::FMethodPtr InFunc ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateUObject( InUserObject, InFunc ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type > \ WidgetArgsType& AttrName##_UObject( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TUObjectMethodDelegate_OneVar_Const< UserClass, Var1Type >::FMethodPtr InFunc, Var1Type Var1 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateUObject( InUserObject, InFunc, Var1 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type > \ WidgetArgsType& AttrName##_UObject( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TUObjectMethodDelegate_TwoVars_Const< UserClass, Var1Type, Var2Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateUObject( InUserObject, InFunc, Var1, Var2 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type, typename Var3Type > \ WidgetArgsType& AttrName##_UObject( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TUObjectMethodDelegate_ThreeVars_Const< UserClass, Var1Type, Var2Type, Var3Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateUObject( InUserObject, InFunc, Var1, Var2, Var3 ) ); \ return this->Me(); \ } \ template< class UserClass, typename Var1Type, typename Var2Type, typename Var3Type, typename Var4Type > \ WidgetArgsType& AttrName##_UObject( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TUObjectMethodDelegate_FourVars_Const< UserClass, Var1Type, Var2Type, Var3Type, Var4Type >::FMethodPtr InFunc, Var1Type Var1, Var2Type Var2, Var3Type Var3, Var4Type Var4 ) \ { \ _##AttrName = TAttribute< AttrType >::Create( TAttribute< AttrType >::FGetter::CreateUObject( InUserObject, InFunc, Var1, Var2, Var3, Var4 ) ); \ return this->Me(); \ }
SLATE_ARGUMENT(ArgType, ArgName):
/**
* Use this macro to declare a slate argument.使用这个宏可以为你的正在构建的Widget声明一个参数,这个参数不是一个TAttribute<>类型(属性),只是一个一般数据类型的变量
* Arguments differ from attributes in that they can only be values.Argumet和Attribute的区别在于Argument只能是一个值,而Attitude可以是一个值或者方法,并且可以为其绑定代理。
*/
ArgType: 参数类型
ArgName:参数名
*/ #define SLATE_ARGUMENT( ArgType, ArgName ) \ ArgType _##ArgName; \ WidgetArgsType& ArgName( ArgType InArg ) \ { \ _##ArgName = InArg; \ return this->Me(); \ }

浙公网安备 33010602011771号