[UE] Slate editor dynamically adds Button

foreword

Implement the editor to dynamically add interface elements, such as buttons

Effect

insert image description here

accomplish

.h file to add definition
insert image description here

.cpp file implements logic

  1. interface layout
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. button click
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
                     ];
       }
}

Guess you like

Origin blog.csdn.net/sinat_34870723/article/details/125042868