UE4 UMG widget構(gòu)造初始化函數(shù)中獲取其內(nèi)部組件
目的:在自定義的Widget初始化完畢后,獲取其內(nèi)部的button、combo等UMG組件的C++指針。
這里我們新建了一個(gè)C++類,LoginWidget,繼承自UserWidget,然后新建了一個(gè)Widget藍(lán)圖LoginWidgetBP,繼承自LoginWidget C++ class。我們想在這個(gè)LoginWidgetBP藍(lán)圖被實(shí)例化之后,獲取這個(gè)UI藍(lán)圖內(nèi)的各個(gè)UI組件。
具體實(shí)現(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;
- }
其中,這個(gè)判斷是必須的,否則出現(xiàn)空指針異常:
- if (!Super::Initialize())
- {
- return false;
- }
ComboServer、TxtBoxAccount、TxtBoxPwd三個(gè)字符串分別是widget組件ID。另外也不用擔(dān)心各個(gè)組件的層級(jí)關(guān)系(比如,Image A是Button的子節(jié)點(diǎn)),widget藍(lán)圖中的所有組件存放在UserWidget中的一個(gè)map當(dāng)中。
補(bǔ)充:
父類還有一個(gè)函數(shù):
- virtual void CustomNativeInitilize() {}
如果當(dāng)前實(shí)例化的UI不是widget藍(lán)圖,而是一個(gè)C++ class,在觸發(fā)Initialize()之后,還會(huì)繼續(xù)觸發(fā)CustomNativeInitilize(),否則只觸發(fā)Initialize(),參見(jiàn)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();
- }
-
分享到:
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)
- 用戶名:
- 密 碼:
- 驗(yàn)證碼: 看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條