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

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。

http://www.xdnf.cn/news/4442.html

相关文章:

  • WPF MVVM进阶系列教程(一、对话框)
  • 广告屏蔽插件的内部细节EasyList 规则详解:为什么广告屏蔽不直接用 CSS/JS?​(彩蛋)
  • MATLAB在数学问题求解中的多元应用探究
  • BeanFactoryPostProcessor 与 BeanPostProcessor 的区别
  • 【Qt】Qt 构建系统详解:qmake 入门到项目实战
  • 鸿蒙开发——2.ArkTS声明式开发(页面和自定义组件)
  • HTTP请求与缓存、页面渲染全流程
  • 【Java ee 初阶】多线程(8)
  • Redis再次开源!reids8.0.0一键安装脚本分享
  • CentOS算法部署
  • ROS2: 服务通信
  • 机器学习实操 第二部分 神经网路和深度学习 第14章 使用卷积神经网络进行深度计算机视觉
  • 精益数据分析(48/126):UGC商业模式的指标剖析与运营策略
  • 8. HTML 表单基础
  • PostgreSQL给新用户授权select角色
  • 【C++】类和对象(下)
  • day009-用户管理专题
  • 304.不同的二叉搜索树
  • mysql:什么是一致性视图(Read View)
  • AI应用开发实战分享
  • C++模板
  • Python引领前后端创新变革,重塑数字世界架构
  • ✍️【TS类型体操进阶】挑战类型极限,成为类型魔法师![特殊字符]♂️✨
  • iTwin 数据报表(只是简单的原型不代表实现)
  • python 使用 mongodb 的一些方法
  • Spring Boot 中如何解决 CORS 问题(详解)
  • 【Java ee 初阶】多线程(9)上
  • Redis从入门到实战 - 高级篇(上)
  • day 14 SHAP可视化
  • Android学习总结之Binder篇