当前位置: 首页 > news >正文

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。

相关文章:

  • C++回调函数学习
  • Linux:进程控制1
  • 标量/向量/矩阵/张量/范数详解及其在机器学习中的应用
  • 第8章-1 查询性能优化-优化数据访问
  • 构建安全的机器学习推理API:基于FastAPI的用户认证与管理实战
  • 用R语言+随机森林玩转遥感空间预测-基于R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析
  • AI工场全面激活电商创意链
  • 配置Hadoop集群-测试使用
  • 拆解 Prompt 工程:五大场景驱动 DeepSeek 超越 ChatGPT
  • Eclipse 插件开发 5 编辑器
  • 【优化策略】离散化
  • 项目改 pnpm 并使用 Monorepo 发布至 npm 上
  • Python----神经网络(《Going deeper with convolutions》论文解读和GoogLeNet网络)
  • gitignore的相关用法
  • 51单片机快速成长路径
  • Spring MVC中Controller是如何把数据传递给View的?
  • 2025ISCC练武校级赛部分题解WP
  • (1-1)Java的JDK、JRE、JVM三者间的关系
  • 可视化魔法指南
  • 如何检查 Watchtower 是否正常工作及更新未生效的排查方法【日常排错】
  • 屈晓华履新四川省社科联党组书记,此前担任省国动办主任
  • 【社论】以法治力量促进民企长远健康发展
  • 成都公积金新政征求意见:购买保障性住房最高贷款额度上浮50%
  • “20后”比“60后”更容易遭遇极端气候事件
  • 咖啡戏剧节举办第五年,上生新所“无店不咖啡,空间皆可戏”
  • 前瞻|美联储明晨“按兵不动”几无悬念:关税战阴霾下,会否释放降息信号