UMG widget構造初始化函式中獲取其內部元件

2021-09-30 13:35:39 字數 1465 閱讀 5105

目的:在自定義的widget初始化完畢後,獲取其內部的button、combo等umg元件的c++指標。

這裡我們新建了乙個c++類,loginwidget,繼承自userwidget,然後新建了乙個widget藍圖loginwidgetbp,繼承自loginwidget c++ class。我們想在這個loginwidgetbp藍圖被例項化之後,獲取這個ui藍圖內的各個ui元件。

具體實現:

loginwidget.h

cpp**  

bool initialize() override;  

ucomboboxstring* comboserver;  

ueditabletextbox* txtboxaccount;  

ueditabletextbox* txtboxpwd;  

假設我自己的widget叫loginwidget,繼承自:userwidget。

cpp**  

uloginwidget::uloginwidget(const fobjectinitializer& objectinitializer) : super(objectinitializer)  

bool uloginwidget::initialize()  

if (ucomboboxstring* combo = cast(getwidgetfromname("comboserver")))  

if (ueditabletextbox* txtbox = cast(getwidgetfromname("txtboxaccount")))  

if (ueditabletextbox* txtbox = cast(getwidgetfromname("txtboxpwd")))  

return

true;  

}  

其中,這個判斷是必須的,否則出現空指標異常:

cpp**  

if (!super::initialize())    

comboserver、txtboxaccount、txtboxpwd三個字串分別是widget元件id。另外也不用擔心各個元件的層級關係(比如,image a是button的子節點),widget藍圖中的所有元件存放在userwidget中的乙個map當中。

補充:

父類還有乙個函式:

cpp**  

virtual

void customnativeinitilize() {}  

如果當前例項化的ui不是widget藍圖,而是乙個c++ class,在觸發initialize()之後,還會繼續觸發customnativeinitilize(),否則只觸發initialize(),參見userwidget.cpp:

cpp**  

bool uuserwidget::initialize()  

else

java中靜態初始化塊,例項初始化塊,建構函式區別

public class people public people string name param args public static void main string args 執行效果 new兩個例項,從執行結果可以看出,靜態變數和靜態初始化塊都是在類載入到系統時,載入到系統中,靜態初始化...

構造器初始化

構造器初始化 1.初始化順序 即使變數定義分散於方法定義之間,它仍會在任何方法 包括構造器 被呼叫之前得到初始化。變數定義的先後順序決定了初始化的順序 例 package clear class window class house window w2 new window 2 void f win...

建構函式初始化(預設構造)

當且僅當沒有定義任何建構函式時,編譯器才會提供預設建構函式。為類定義了建構函式後,程式設計師就必須為他提供預設建構函式。我們怎麼理解這句話呢?首先,什麼是預設建構函式?預設建構函式時在未提供顯示初始化時,用來建立物件的建構函式。也就是說,它是用於下面這種宣告的建構函式 expa expa 然後我們看...