UE4 蓝图与C++交互 UserWidget

12 篇文章 2 订阅

本文转自:UE4 蓝图与C++交互 UserWidget - 码农拔萝卜 - 博客园1.C++声明函数,蓝图实现该函数,C++调用 首先,在C++类中声明一个方法,使用BlueprintImplementableEvent标识该方法为蓝图实现事件; /*此函数可以在蓝图或关卡蓝图图表https://www.cnblogs.com/minnong/p/15424689.html

1.C++声明函数,蓝图实现该函数,C++调用

  首先,在C++类中声明一个方法,使用BlueprintImplementableEvent标识该方法为蓝图实现事件;

    /*此函数可以在蓝图或关卡蓝图图表内进行重载*/
    UFUNCTION(BlueprintImplementableEvent, Category="SplineMesh")
    void PrintMessage(const FString &Message)

  其次,新建一个蓝图继承此类,并重载PrintMessage函数

图片引用自:https://blog.csdn.net/qq992817263/article/details/52571678

2.C++声明函数,并添加默认实现,蓝图可实现,可不实现,如未实现,则使用C++默认实现方法

//C++实现默认版本,蓝图可override实现

UFUNCTION(BlueprintNativeEvent, Category="NativeEvent")

void FuncNativeBPEvent();
C++实现该函数时,函数名称要加上“_Implementation”,如下:

void FuncNativeBPEvent_Implementation()
{
  // 函数具体实现  
}

3.C++ 调用纯蓝图方法

 C++ 可以通过命令行的方式调用蓝图实现的方法并传递参数,当然,前提是你能够获取到拥有这个方法的对象(DCRLabelWidget);下面例子中,我们调用DCRLabelWidget对象的名为SetName的方法,并传入参数“0011”.

#include "Misc/OutputDeviceDebug.h"

FString FieldName = TEXT("0011");
FString cmd = TEXT("SetName ")+ FieldName;
FOutputDeviceDebug device;
DCRLabelWidget->CallFunctionByNameWithArguments(*cmd, device, NULL, true);

4.C++获取蓝图UserWidget内部控件

  假设UI_Label为我们蓝图创建的UserWidget,内部有一个名为Btn_OnClick的Button组件,可以通过如下方式,找到这个Button对象,并给该button绑定点击事件。

// UserWidget绑定2D screen模式下的点击事件
        if (UButton* ButtonOnClick = Cast<UButton>(UI_Label->GetWidgetFromName(TEXT("Btn_OnClick"))))//Button_OnClick
        {
            FScriptDelegate ButtonOnClickDelegate;
            ButtonOnClickDelegate.BindUFunction(this, "LabelOnClickCallBack");
            ButtonOnClick->OnClicked.Add(ButtonOnClickDelegate);
        }

5.C++获取蓝图属性,及向蓝图属性赋值

// 从DCRLabelWidget读取Float类型属性PX
for (TFieldIterator<FFloatProperty> StrProperty(DCRLabelWidget->GetClass()); StrProperty; ++StrProperty)
    {
        if (StrProperty->GetName().Contains(TEXT("PX")))
        {
            AbsoluteSizeX = StrProperty->GetPropertyValue_InContainer(DCRLabelWidget);
            break;
        }
    }

// DCRLabelWidget 为要设置属性的UserWidget对象,这里以float类型属性为例
for (TFieldIterator<FFloatProperty> StrProperty(DCRLabelWidget->GetClass()); StrProperty; ++StrProperty)
{
    // 属性名称为SizeX
 if (StrProperty->GetName().Contains(TEXT("SizeX")))
 {
  StrProperty->SetPropertyValue_InContainer(DCRLabelWidget, AbsoluteSizeX);
    break;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值