1. 程式人生 > >組件Slate教程 & UMG widget構造初始化函數中獲取其內部組件

組件Slate教程 & UMG widget構造初始化函數中獲取其內部組件

test c++類 init 初始化 bin wid initial box flags

轉自: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構造初始化函數中獲取其內部組件