UE4 UMG widget構(gòu)造初始化函數(shù)中獲取其內(nèi)部組件
目的:在自定義的Widget初始化完畢后,獲取其內(nèi)部的button、combo等UMG組件的C++指針。
這里我們新建了一個C++類,LoginWidget,繼承自UserWidget,然后新建了一個Widget藍(lán)圖LoginWidgetBP,繼承自LoginWidget C++ class。我們想在這個LoginWidgetBP藍(lán)圖被實例化之后,獲取這個UI藍(lán)圖內(nèi)的各個UI組件。
具體實現(xiàn):
LoginWidget.h
- bool Initialize() override;
- UComboBoxString* ComboServer;
- UEditableTextBox* TxtBoxAccount;
- UEditableTextBox* TxtBoxPwd;
假設(shè)我自己的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;
- }
其中,這個判斷是必須的,否則出現(xiàn)空指針異常:
- if (!Super::Initialize())
- {
- return false;
- }
ComboServer、TxtBoxAccount、TxtBoxPwd三個字符串分別是widget組件ID。另外也不用擔(dān)心各個組件的層級關(guān)系(比如,Image A是Button的子節(jié)點),widget藍(lán)圖中的所有組件存放在UserWidget中的一個map當(dāng)中。
補(bǔ)充:
父類還有一個函數(shù):
- virtual void CustomNativeInitilize() {}
如果當(dāng)前實例化的UI不是widget藍(lán)圖,而是一個C++ class,在觸發(fā)Initialize()之后,還會繼續(xù)觸發(fā)CustomNativeInitilize(),否則只觸發(fā)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條