一.在构造时,就拿到UI元素的指针。这里有很多例子可以参考。基本都是通过GetWidgetFromName拿到,用名字拿到指针。
cpp
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);
}
//Delete
Delete = (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事件,回调函数。
cpp
Add = (UButton*)GetWidgetFromName(TEXT("AddButton"));
if (Add->IsValidLowLevel())
{
//绑定
Add->OnClicked.AddDynamic(this, &ULZJUserWidget::AddBulid);
}
同理,再看一个 UComboBoxString 组件

找到Event

转到FOnSelectionChangedEvent的定义,发现绑定需要两个参数,有参动态多播。所以定义Event的,函数需要对应这两个。

这里UpdateType里,就有对于的FString,ESeletctInfo::Type。其实都不用改,把里面的抄到你定义的函数里,把多余的逗号去掉。这个和之前文章的碰撞回调是一样的,也是AddDynamic回调。
cpp
void ULZJUserWidget::UpdateAddType(FString SelectedItem, ESelectInfo::Type SelectionType)
{
SetAddType(SelectedItem);
}
这里就是选择不同的,添加类型。回传用户选择的类型FString。