UE4 通过使用 FOverlaySlot 修改 SOverlay 的 Slot 属性
这里我们创建一个按钮,通过保存按钮的Slot属性到FOverlaySolt中,通过点击该按钮的事件改变按钮的Slot属性,从而改变按钮自身的位置
头文件中定义一个事件和一个FOverlaySlot
SSlAiMenuHUDWidget.h
#include "Widgets/SOverlay.h" class SLAICOURSE_API SSlAiMenuHUDWidget : public SCompoundWidget { public: SLATE_BEGIN_ARGS(SSlAiMenuHUDWidget) {} SLATE_END_ARGS() /** Constructs this widget with InArgs */ void Construct(const FArguments& InArgs); private: //点击事件 FReply OnClick(); private: /* 可保存Slot的属性到ImageSlot,可以通过修改ImageSlot的属性,从而相当于修改组件Slot的属性,FOverlaySlot是属于SOverlay下的类中类*/ SOverlay::FOverlaySlot* ImageSlot; };
SSlAiMenuHUDWidget.cpp
#include "UI/Widget/SSlAiMenuHUDWidget.h" #include …… BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION void SSlAiMenuHUDWidget::Construct(const FArguments& InArgs) { MenuStyle = &SlAiStyle::Get().GetWidgetStyle<FSlAiMenuStyle>("BPSlAiMenuStyle"); ChildSlot [ SNew(SDPIScaler) .DPIScale(UIScaler) [ SNew(SOverlay) //创建的按钮 +SOverlay::Slot() .HAlign(HAlign_Left) .VAlign(VAlign_Top) .Expose(ImageSlot) //保存Slot到ImageSlot [ SNew(SButton) .OnClicked(this, &SSlAiMenuHUDWidget::OnClick) //Button事件 ] ] ]; } END_SLATE_FUNCTION_BUILD_OPTIMIZATION //点击事件 FReply SSlAiMenuHUDWidget::OnClick() { ImageSlot->HAlign(HAlign_Right).VAlign(VAlign_Bottom); return FReply::Handled(); }
初始时创建的按钮位置为画面左上角,点击按钮后触发SSlAiMenuHUDWidget::OnClick() 会将按钮的Slot信息改变到右下角