組件Slate教程 & UMG widget構造初始化函數中獲取其內部組件
轉自:http://aigo.iteye.com/blog/2296218
目的:在自定義的Widget初始化完畢後,獲取其內部的button、combo等UMG組件的C++指針。
這裏我們新建了一個C++類,LoginWidget,繼承自UserWidget,然後新建了一個Widget藍圖LoginWidgetBP,繼承自LoginWidget C++ class。我們想在這個LoginWidgetBP藍圖被實例化之後,獲取這個UI藍圖內的各個UI組件。
具體實現:
LoginWidget.h
bool Initialize() override; UComboBoxString* ComboServer; UEditableTextBox* TxtBoxAccount; UEditableTextBox* TxtBoxPwd;
假設我自己的Widget叫LoginWidget,繼承自:UserWidget。
Cpp代碼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(); } } }
C++UI組件Slate教程
官方文檔:
Slate, Hello
https://wiki.unrealengine.com/Slate,_Hello
Slate Widget Examples
https://docs.unrealengine.com/latest/INT/Programming/Slate/Widgets/
Slate Tutorial
https://forums.unrealengine.com/showthread.php?822-Slate-Tutorial
組件Slate教程 & UMG widget構造初始化函數中獲取其內部組件