UE4 UMG widget構造初始化函數中獲取其內部組件
目的:在自定義的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。
- 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();
- }
-
分享到:
全部評論:0條