UE5.3 C++ 如何在c++ 中拿到UI元素,并绑定不同事件响应功能
一.在构造时,就拿到UI元素的指针。这里有很多例子可以参考。基本都是通过GetWidgetFromName拿到,用名字拿到指针。
void UWidget::NativeConstruct()
{Super::NativeConstruct();TArray<AActor*> TBActors;UGameplayStatics::GetAllActorsOfClass(GetWorld(), ATableManagerActor::StaticClass(), TBActors);TableManager = Cast<ATableManagerActor>(TBActors[0]);m_BuildFactory = GetGameInstance()->GetSubsystem<UBuildFactory>();m_BuildManagerIns = GetGameInstance()->GetSubsystem<UBuildManagerInstance>();Add = (UButton*)GetWidgetFromName(TEXT("AddButton"));if (Add->IsValidLowLevel()){//绑定Add->OnClicked.AddDynamic(this, &ULZJUserWidget::AddBulid);}//DeleteDelete = (UButton*)GetWidgetFromName(TEXT("DeleteButton"));if (Delete->IsValidLowLevel()){Delete->OnClicked.AddDynamic(this, &ULZJUserWidget::DeleteBuild);}AddTypeChoose = (UComboBoxString*)GetWidgetFromName(TEXT("AddType"));if (AddTypeChoose->IsValidLowLevel()){AddTypeChoose->OnSelectionChanged.AddDynamic(this, &ULZJUserWidget::UpdateAddType);}IDInput = (UEditableText*)GetWidgetFromName(TEXT("ID_Text"));if (IDInput->IsValidLowLevel()){IDInput->OnTextChanged.AddDynamic(this,&ULZJUserWidget::UpdateIDInput); //按下回车触发}Save = (UButton*)GetWidgetFromName(TEXT("SaveButton"));if (Save->IsValidLowLevel()){Save->OnClicked.AddDynamic(this, &ULZJUserWidget::SaveToDataTable);}//Edit = (UButton*)GetWidgetFromName(TEXT("EditButton"));//if (Edit->IsValidLowLevel())//{// Edit->OnClicked.AddDynamic(this, &ULZJUserWidget::EditToDataTable);//}BuildInfoPannel = (UPanelWidget*)GetWidgetFromName(TEXT("BuildInfoPanel"));if (BuildInfoPannel->IsValidLowLevel()){BuildInfoPannel->SetVisibility(ESlateVisibility::Hidden);}AreaInput = (UEditableText*)GetWidgetFromName(TEXT("AreaInputText"));if (AreaInput->IsValidLowLevel()){AreaInput->OnTextChanged.AddDynamic(this,&ULZJUserWidget::SetArea);}PriceInput = (UEditableText*)GetWidgetFromName(TEXT("PriceInput"));if (PriceInput->IsValidLowLevel()){PriceInput->OnTextChanged.AddDynamic(this, &ULZJUserWidget::SetPrice);}PopulationInput = (UEditableText*)GetWidgetFromName(TEXT("ResidentPopInput"));if (PopulationInput->IsValidLowLevel()){PopulationInput->OnTextChanged.AddDynamic(this, &ULZJUserWidget::SetPrice);}PosXInput = (USpinBox*)GetWidgetFromName(TEXT("PosX"));if (PosXInput->IsValidLowLevel()){PosXInput->OnValueCommitted.AddDynamic(this, &ULZJUserWidget::UpdatePosX);}PosYInput = (USpinBox*)GetWidgetFromName(TEXT("PosY"));if (PosYInput->IsValidLowLevel()){PosYInput->OnValueCommitted.AddDynamic(this, &ULZJUserWidget::UpdatePosY);}PosZInput = (USpinBox*)GetWidgetFromName(TEXT("PosZ"));if (PosZInput->IsValidLowLevel()){PosZInput->OnValueCommitted.AddDynamic(this, &ULZJUserWidget::UpdatePosZ);}DataToOut = (UButton*)GetWidgetFromName(TEXT("DataOutTable"));if (DataToOut->IsValidLowLevel()){DataToOut->OnClicked.AddDynamic(this, &ULZJUserWidget::DataToCSV);}LoadFromCSV = (UButton*)GetWidgetFromName(TEXT("Load"));if (LoadFromCSV->IsValidLowLevel()){LoadFromCSV->OnClicked.AddDynamic(this,&ULZJUserWidget::DataFromDT);}EditeID = (UEditableText*)GetWidgetFromName(TEXT("UIEditeID"));if (EditeID->IsValidLowLevel()){EditeID->OnTextChanged.AddDynamic(this, &ULZJUserWidget::SetPrice);}EditeArea = (UEditableText*)GetWidgetFromName(TEXT("UIEditeArea"));if (EditeArea->IsValidLowLevel()){EditeArea->OnTextChanged.AddDynamic(this, &ULZJUserWidget::SetPrice);}EditePrice = (UEditableText*)GetWidgetFromName(TEXT("UIEditePrice"));if(EditePrice->IsValidLowLevel()){EditePrice->OnTextChanged.AddDynamic(this, &ULZJUserWidget::SetPrice);}EditPopulation = (UEditableText*)GetWidgetFromName(TEXT("UIEditePopulation"));if (EditPopulation->IsValidLowLevel()){EditPopulation->OnTextChanged.AddDynamic(this, &ULZJUserWidget::SetPrice);}EditPannel = (UPanelWidget*)GetWidgetFromName(TEXT("EditeBuildInfoPanel"));if (EditPannel->IsValidLowLevel()){EditPannel->SetVisibility(ESlateVisibility::Hidden);}CommiteChange = (UButton*)GetWidgetFromName(TEXT("CommiteButton"));if (CommiteChange->IsValidLowLevel()){CommiteChange->OnClicked.AddDynamic(this, &ULZJUserWidget::CommitBuildInfo);}//EditeArea = (UEditableText*)GetWidgetFromName(TEXT(""));////AddTypeChoose = (UPanelWidget*)GetWidgetFromName(TEXT("AddList"));//if (AddTargetType->IsValidLowLevel())//{// AddTargetType->SetVisibility(ESlateVisibility::Visible);//}InitialAddTypeChoose();TableManager->SetBuildEditUI(this);
}
二.对不同元素进行,事件绑定。这里的AddDynamic基本就是进行绑定的操作。但是不同的元素,需要的绑定参数是不一样的,比如按钮,OnClick,只需绑定点击后回调的函数名,而Text则绑定文本变化后,回调的函数。
如何看,其实要看源码的书写定义就知道了。UButton里,有OnClicked的回调。当然里面还有其他的,比如OnPressed。
再转Evenet的定义
从声明里可以看出,这个是无参,多播的回调。所以只需传Event事件,回调函数。
Add = (UButton*)GetWidgetFromName(TEXT("AddButton"));if (Add->IsValidLowLevel()){//绑定Add->OnClicked.AddDynamic(this, &ULZJUserWidget::AddBulid);}
同理,再看一个 UComboBoxString 组件
找到Event
转到FOnSelectionChangedEvent的定义,发现绑定需要两个参数,有参动态多播。所以定义Event的,函数需要对应这两个。
这里UpdateType里,就有对于的FString,ESeletctInfo::Type。其实都不用改,把里面的抄到你定义的函数里,把多余的逗号去掉。这个和之前文章的碰撞回调是一样的,也是AddDynamic回调。
void ULZJUserWidget::UpdateAddType(FString SelectedItem, ESelectInfo::Type SelectionType)
{SetAddType(SelectedItem);
}
这里就是选择不同的,添加类型。回传用户选择的类型FString。