UE5.3 C++ 如何在c++ 中拿到UI元素,并绑定不同事件响应功能

一.在构造时,就拿到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。

相关推荐
REDcker3 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
UI设计兰亭妙微3 小时前
兰亭妙微|B端表单设计:UI设计公司中的场景化布局指南,提升用户填写效率
ui·b端界面设计·高端网站设计
basketball6164 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
想唱rap4 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
落羽的落羽6 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
goodesocket6 小时前
芯片HAST测试:通电工作下如何精准模拟极端环境挑战?
c++
特种加菲猫6 小时前
从零开始手撕AVL树:详解插入、平衡因子更新与四种旋转
开发语言·c++
萑澈6 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
江屿风7 小时前
C++OJ题经验总结(竞赛)1
开发语言·c++·笔记·算法
运筹vivo@7 小时前
LeetCode 2405. 子字符串的最优划分
c++·算法·leetcode·职场和发展·哈希表