【UE】Slate编辑器动态添加Button

前言

实现编辑器动态添加界面元素,例如button之类的

效果

在这里插入图片描述

实现

.h文件添加定义
在这里插入图片描述

.cpp文件实现逻辑

  1. 界面排版
TSharedRef<SDockTab> FDynamicCreateToolModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
{
    
    
       TSharedRef<SDockTab> dockTabSharedRef =
              SNew(SDockTab)
              .TabRole(ETabRole::NomadTab)
              [
                     SNew(SVerticalBox)
                     + SVerticalBox::Slot()
                     [
                           SNew(SHorizontalBox)
                           + SHorizontalBox::Slot()
                           [
                                  SNew(SButton)
                                  .Text(FText::FromString("Add"))
                                  .OnClicked_Raw(this, &FDynamicCreateToolModule::AddButtonOnClick)
                                  ]
                           + SHorizontalBox::Slot()
                           [
                                  SNew(SButton)
                                  .Text(FText::FromString("Remove"))
                                  .OnClicked_Raw(this, &FDynamicCreateToolModule::RemoveButtonOnClick)
                           ]
                     ]
                     + SVerticalBox::Slot()
                     [
                           SAssignNew(VerticalBoxPtr, SVerticalBox)
                     ]
              ];
       return dockTabSharedRef;
}
  1. 按钮点击
FReply FDynamicCreateToolModule::AddButtonOnClick()
{
    
    
       ButtonCount += 1;
       UpdateDynamicButtonCount();
       return FReply::Handled();
}
FReply FDynamicCreateToolModule::RemoveButtonOnClick()
{
    
    
       ButtonCount -= 1;
       if (ButtonCount < 0)
       {
    
    
              ButtonCount = 0;
       }
       UpdateDynamicButtonCount();
       return FReply::Handled();
}
void FDynamicCreateToolModule::UpdateDynamicButtonCount()
{
    
    
       VerticalBoxPtr->ClearChildren();
       for (int index = 0; index < ButtonCount; index++)
       {
    
    
              int id = index;
              VerticalBoxPtr->AddSlot()
                     [
                           SNew(SButton)
                           .Text(FText::FromString(FString::FromInt(id)))
                           .OnClicked(FOnClicked::CreateLambda([id]
                                  {
    
    
                                         UE_LOG(LogTemp, Display, TEXT("OnClick: %d"), id);
                                         return FReply::Handled();
                                  }))
                     ];
              VerticalBoxPtr->AddSlot()
                     [
                           SNullWidget::NullWidget
                     ];
       }
}

猜你喜欢

转载自blog.csdn.net/sinat_34870723/article/details/125042868