UMG widget构造初始化函数中获取其内部组件

2024-06-04 22:08

本文主要是介绍UMG widget构造初始化函数中获取其内部组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目的:在自定义的Widget初始化完毕后,获取其内部的button、combo等UMG组件的C++指针。

 

这里我们新建了一个C++类,LoginWidget,继承自UserWidget,然后新建了一个Widget蓝图LoginWidgetBP,继承自LoginWidget C++ class。我们想在这个LoginWidgetBP蓝图被实例化之后,获取这个UI蓝图内的各个UI组件。

 

具体实现:

LoginWidget.h

Cpp代码  
  1. bool Initialize() override;  
  2. UComboBoxString* ComboServer;  
  3. UEditableTextBox* TxtBoxAccount;  
  4. UEditableTextBox* TxtBoxPwd;  

 

 

假设我自己的Widget叫LoginWidget,继承自:UserWidget。

Cpp代码  
  1. ULoginWidget::ULoginWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)  
  2. {  
  3.     ComboServer = NULL;  
  4.     TxtBoxAccount = NULL;  
  5.     TxtBoxPwd = NULL;  
  6. }  
  7.   
  8. bool ULoginWidget::Initialize()  
  9. {  
  10.     if (!Super::Initialize())  
  11.     {  
  12.         return false;  
  13.     }  
  14.       
  15.     if (UComboBoxString* combo = Cast<UComboBoxString>(GetWidgetFromName("ComboServer")))  
  16.     {  
  17.         ComboServer = combo;  
  18.     }  
  19.     if (UEditableTextBox* txtbox = Cast<UEditableTextBox>(GetWidgetFromName("TxtBoxAccount")))  
  20.     {  
  21.         TxtBoxAccount = txtbox;  
  22.         TxtBoxAccount->SetKeyboardFocus();  
  23.     }  
  24.     if (UEditableTextBox* txtbox = Cast<UEditableTextBox>(GetWidgetFromName("TxtBoxPwd")))  
  25.     {  
  26.         TxtBoxPwd = txtbox;  
  27.     }  
  28.   
  29.     return true;  
  30. }  

 

其中,这个判断是必须的,否则出现空指针异常:

Cpp代码  
  1. if (!Super::Initialize())  
  2. {  
  3.     return false;  
  4. }  

 ComboServer、TxtBoxAccount、TxtBoxPwd三个字符串分别是widget组件ID。另外也不用担心各个组件的层级关系(比如,Image A是Button的子节点),widget蓝图中的所有组件存放在UserWidget中的一个map当中。

 

补充:

父类还有一个函数:

Cpp代码  
  1. virtual void CustomNativeInitilize() {}  

 如果当前实例化的UI不是widget蓝图,而是一个C++ class,在触发Initialize()之后,还会继续触发CustomNativeInitilize(),否则只触发Initialize(),参见UserWidget.cpp:

Cpp代码  
  1. bool UUserWidget::Initialize()  
  2. {  
  3.     // If it's not initialized initialize it, as long as it's not the CDO, we never initialize the CDO.  
  4.     if ( !bInitialized && !HasAnyFlags(RF_ClassDefaultObject) )  
  5.     {  
  6.         bInitialized = true;  
  7.   
  8.         // Only do this if this widget is of a blueprint class  
  9.         UWidgetBlueprintGeneratedClass* BGClass = Cast<UWidgetBlueprintGeneratedClass>(GetClass());  
  10.         if ( BGClass != nullptr )  
  11.         {  
  12.             BGClass->InitializeWidget(this);  
  13.         }  
  14.         else  
  15.         {  
  16.             CustomNativeInitilize();  
  17.         }  

这篇关于UMG widget构造初始化函数中获取其内部组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031258

相关文章

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息