UE4自定义资源编辑器开发-Slate语法

UE4自定义资源编辑器开发-Slate语法

1 概述


对于slate编程,UE4有着特定的语法,如:


TSharedRef<SWidget> TitleBarWidget =
	SNew(SBorder)
	.BorderImage(FEditorStyle::GetBrush(TEXT("Graph.TitleBackground")))
	.HAlign(HAlign_Fill)
	[
		SNew(SHorizontalBox)
		+ SHorizontalBox::Slot()
	.HAlign(HAlign_Center)
	.FillWidth(1.f)
	[
		SNew(STextBlock)
		.Text(LOCTEXT("TestGraphLabel", "Test"))
	    .TextStyle(FEditorStyle::Get(), TEXT("GraphBreadcrumbButtonText"))
	]
	];

若了解该语法规则,则很容易创建出自己想要的UI样式。


2 SNew,SAssignNew

UE4中,Slate的创建一般使用关键字:SNewSAssignNew

#define SNew( WidgetType, ... ) \
	MakeTDecl<WidgetType>( #WidgetType, __FILE__, __LINE__, RequiredArgs::MakeRequiredArgs(__VA_ARGS__) ) <<= TYPENAME_OUTSIDE_TEMPLATE WidgetType::FArguments()


#define SAssignNew( ExposeAs, WidgetType, ... ) \
	MakeTDecl<WidgetType>( #WidgetType, __FILE__, __LINE__, RequiredArgs::MakeRequiredArgs(__VA_ARGS__) ) . Expose( ExposeAs ) <<= TYPENAME_OUTSIDE_TEMPLATE WidgetType::FArguments()

使用SAssignNew,可以在创建后获得对应slate UI的引用,任意类型的SWidget子类,需要使用SLATE_BEGIN_ARGS 与 SLATE_END_ARS 来支持 SNew 与 SAssignNew的创建规则。

class SMyWidget : public SWidget
{
public:
     SLATE_BEGIN_ARGS( SMyWidget )
          , _PreferredWidth( 150.0f )
          , _ForegroundColor( FLinearColor::White )
        {}
 
          SLATE_ATTRIBUTE(float, PreferredWidth)
          SLATE_ATTRIBUTE(FSlateColor, ForegroundColor)
     SLATE_END_ARGS()

	 ...
}

宏定义如下:

#define SLATE_BEGIN_ARGS( WidgetType ) \
	public: \
	struct FArguments : public TSlateBaseNamedArgs<WidgetType> \
	{ \
		typedef FArguments WidgetArgsType; \
		FORCENOINLINE FArguments()


#define SLATE_END_ARGS() \
	};

3 编程规则

按照以下规则来创建编辑器的Slate UI:

	SNew(SBorder) //create a top slate widget
	.BorderImage(FEditorStyle::GetBrush(TEXT("Graph.TitleBackground"))) // slate property
	.HAlign(HAlign_Fill) // Alignment
	[                    // brackets[] to create sub content
		SNew(SHorizontalBox) // create horizontal layout
		+ SHorizontalBox::Slot()
		.HAlign(HAlign_Center)
		.FillWidth(1.f)
		[                    
			SNew(STextBlock)
			.Text(LOCTEXT("TestGraphLabel", "Test"))
			.TextStyle(FEditorStyle::Get(), TEXT("GraphBreadcrumbButtonText"))
		]
	];

TitleBar


链接




Tags: UE4 Editor Vistied:
Share: Twitter Facebook LinkedIn