Fork me on GitHub

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信息改变到右下角

 

 

 

 

 

 

 

 

 

 

posted @ 2021-07-23 17:48  索智源  阅读(420)  评论(0编辑  收藏  举报