Creation
Do not subclass SWidget
As mentioned in the class comment, do not subclass directly SWidget.
Epic recommends using LeafWidget or SPanel (or any other subclass) as the minimum slate widget class.
Example of custom Slate class with args
// .h
class SPSPrefabSystemBlueprintWindow : public SVerticalBox
{
SLATE_BEGIN_ARGS(SPSPrefabSystemBlueprintWindow)
: _BlueprintEditorPtr(),
_PrefabEditorSubsystem()
{}
SLATE_ARGUMENT(TSharedPtr<FBlueprintEditor>, BlueprintEditorPtr)
SLATE_ARGUMENT(UPSPrefabEditorSubsystem*, PrefabEditorSubsystem)
SLATE_END_ARGS()
public:
SPSPrefabSystemBlueprintWindow(): PrefabEditorSubsystem(nullptr) {}
void Construct(const FArguments& InArgs);
virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
virtual int32 OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const override;
private:
TSharedPtr<FBlueprintEditor> BlueprintEditorPtr;
UPSPrefabEditorSubsystem* PrefabEditorSubsystem;
};
// .cpp
void SPSPrefabSystemBlueprintWindow::Construct(const FArguments& InArgs)
{
BlueprintEditorPtr = InArgs._BlueprintEditorPtr;
PrefabEditorSubsystem = InArgs._PrefabEditorSubsystem;
const bool bHasBlueprintPRC = PrefabEditorSubsystem->DoesBlueprintHavePRC(BlueprintEditorPtr.Get());
if (bHasBlueprintPRC)
{
AddSlot()
.AutoHeight()
[
SNew(STextBlock).Text(INVTEXT("Hello"))
];
}
else
{
AddSlot()
.AutoHeight()
[
SNew(STextBlock).Text(INVTEXT("No Prefab Reference Component were found in this Blueprint Actor.")).ColorAndOpacity(FSlateColor(FColor::Red))
];
}
}
void SPSPrefabSystemBlueprintWindow::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)
{
SWidget::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);
}
int32 SPSPrefabSystemBlueprintWindow::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const
{
return SVerticalBox::OnPaint(Args, AllottedGeometry, MyCullingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled);
}
Assign new widget to variable for later edit
TSharedPtr<SHorizontalBox> HorizontalBox;
// ...
SAssignNew(HorizontalBox, SHorizontalBox)
// ...Combo box
See example of use of SComboBox
Horizontal & Vertical Box
Examples
// Method 1
SNew(SHorizontalBox)
+SHorizontalBox::Slot()
.AutoWidth()
[
SNew(STextBlock).Text(INVTEXT("Hello"))
]
+SHorizontalBox::Slot()
.AutoWidth()
[
SNew(STextBlock).Text(INVTEXT("Hello"))
]
// method 2
TSharedPtr<SVerticalBox> VerticalBox;
SAssignNew(VerticalBox, SVerticalBox);
if (bSomeCondition)
{
VerticalBox->AddSlot()
.AutoHeight()
[
SNew(STextBlock).Text(INVTEXT("Hello"))
];
}
else
{
VerticalBox->AddSlot()
.AutoHeight()
[
SNew(STextBlock).Text(INVTEXT("No Prefab Reference Component were found in this Blueprint Actor.")).ColorAndOpacity(FSlateColor(FColor::Red))
];
}Fill dropdown from enum
See SEnumComboBox
Example:
auto PreviewSelectionDrawModeWidget = SNew(SEnumComboBox, StaticEnum<EPSEditorPRCPreviewSettings_SelectionDrawMode>())
.OnEnumSelectionChanged(SEnumComboBox::FOnEnumSelectionChanged::CreateLambda([this, BlueprintEditorContext] (int32 InValue, ESelectInfo::Type InSelectInfo)
{...}))
.CurrentValue_Lambda([this, BlueprintEditorContext]()
{ return ...});
Common Slate Arguments
Scroll Box
Use SScrollBox.
Color Block
Use SColorBlock. Good for lines to