`
aigo
  • 浏览: 2537921 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

[UE4]UMG widget构造初始化函数中获取其内部组件

UE4 
阅读更多

原文作者:@玄冬Wong

目的:在自定义的Widget初始化完毕后,获取其内部的button、combo等UMG组件的C++指针。

 

这里我们新建了一个C++类,LoginWidget,继承自UserWidget,然后新建了一个Widget蓝图LoginWidgetBP,继承自LoginWidget C++ class。我们想在这个LoginWidgetBP蓝图被实例化之后,获取这个UI蓝图内的各个UI组件。

 

UserWidget 有两个函数可以做初始化,一个是 bool Initialize();  一个是 void NativeConstruct(); 

 

第一种方式:Initialize()函数中初始化。

LoginWidget.h

bool Initialize() override;
UComboBoxString* ComboServer;
UEditableTextBox* TxtBoxAccount;
UEditableTextBox* TxtBoxPwd;

 

 

假设我自己的Widget叫LoginWidget,继承自:UserWidget。

ULoginWidget::ULoginWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
	ComboServer = NULL;
	TxtBoxAccount = NULL;
	TxtBoxPwd = NULL;
}

bool ULoginWidget::Initialize()
{
	if (!Super::Initialize())
	{
		return false;
	}
	
	if (UComboBoxString* combo = Cast<UComboBoxString>(GetWidgetFromName("ComboServer")))
	{
		ComboServer = combo;
	}
	if (UEditableTextBox* txtbox = Cast<UEditableTextBox>(GetWidgetFromName("TxtBoxAccount")))
	{
		TxtBoxAccount = txtbox;
		TxtBoxAccount->SetKeyboardFocus();
	}
	if (UEditableTextBox* txtbox = Cast<UEditableTextBox>(GetWidgetFromName("TxtBoxPwd")))
	{
		TxtBoxPwd = txtbox;
	}

	return true;
}

 

其中,这个判断是必须的,否则出现空指针异常:

if (!Super::Initialize())
{
	return false;
}

 ComboServer、TxtBoxAccount、TxtBoxPwd三个字符串分别是widget组件ID。另外也不用担心各个组件的层级关系(比如,Image A是Button的子节点),widget蓝图中的所有组件存放在UserWidget中的一个map当中。

 

补充:

父类还有一个函数:

virtual void CustomNativeInitilize() {}

 如果当前实例化的UI不是widget蓝图,而是一个C++ class,在触发Initialize()之后,还会继续触发CustomNativeInitilize(),否则只触发Initialize(),参见UserWidget.cpp:

bool UUserWidget::Initialize()
{
	// If it's not initialized initialize it, as long as it's not the CDO, we never initialize the CDO.
	if ( !bInitialized && !HasAnyFlags(RF_ClassDefaultObject) )
	{
		bInitialized = true;

		// Only do this if this widget is of a blueprint class
		UWidgetBlueprintGeneratedClass* BGClass = Cast<UWidgetBlueprintGeneratedClass>(GetClass());
		if ( BGClass != nullptr )
		{
			BGClass->InitializeWidget(this);
		}
		else
		{
			CustomNativeInitilize();
		}

 

第二种方式:NativeConstruct()函数中初始化。

 

void UDebugTestUI::NativeConstruct()
{
	Super::NativeConstruct();

	TxtDebugMsg = Cast<UTextBlock>(GetWidgetFromName(TEXT("TxtDebugMsg")));
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics