对于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样式。
UE4中,Slate的创建一般使用关键字:SNew 和 SAssignNew
#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() \
};
按照以下规则来创建编辑器的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"))
]
];