首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么变量在虚幻引擎中为空?

为什么变量在虚幻引擎中为空?
EN

Stack Overflow用户
提问于 2020-08-02 07:46:22
回答 2查看 3.7K关注 0票数 3

我想调用函数,它改变了小部件中的文本。

有一个virtual函数NativeConstruct,它自动调用。它改变了小部件的文本,但是我需要调用函数F1并发送一个文本给它,我想要显示它。但是当我调用它时,变量Namenullptr。由于某种原因,当程序调用nullptr时,它不是NativeConstruct

  • Name是我的文本变量,我想更改它
  • dialogBottom是具有此变量的小部件的名称。

编辑过的

代码语言:javascript
运行
复制
UAccessWidgetFromCpp* AccessWidgetFromCpp 
= CreateWidget<UAccessWidgetFromCpp>(
      GetWorld()->GetFirstPlayerController(), UAccessWidgetFromCpp::StaticClass()
   );

if (AccessWidgetFromCpp)
{
   AccessWidgetFromCpp->F1("222");
   widgetDialogBottomInstance->AddToViewport();
}

UCLASS()
class HOME_API UAccessWidgetFromCpp : public UUserWidget
{
   GENERATED_BODY()

public:
   UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
   class UTextBlock* Name = nullptr;

   UFUNCTION()
   void F1(FString text);
};

void UAccessWidgetFromCpp::F1(FString text)
{
   if (auto widget = dynamic_cast<UTextBlock*>(GetWidgetFromName(TEXT("Name"))))
   {
      Name = widget;
      Name->SetText(FText::FromString(text));
   }
}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-02 08:01:50

您的UPROPERTY -- Name --在开始时没有初始化为nullptr。因此,它可以包含里面的任何垃圾值

在类定义或UAccessWidgetFromCpp的构造函数中将其初始化为UAccessWidgetFromCpp(如果有的话)。例如,这将解决问题。

代码语言:javascript
运行
复制
UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
class UTextBlock* Name = nullptr;
//                     ^^^^^^^^^^

关于新的更新:

首先,您应该使用避免在C++中使用c型铸造。其次,函数GetWidgetFromName返回对应于给定名称的uobject小部件。因此,您应该确信有一个带有"Name“的。

否则,通过反复检查nullptr场景来确保代码的安全性。

代码语言:javascript
运行
复制
if(auto widget = dynamic_cast<UTextBlock*>(GetWidgetFromName(TEXT("Name")))) 
{
    Name = widget;
    Name->SetText(FText::FromString(text));
}

即使现在还没有到达行,Name->SetText(FText::FromString(text));也意味着您没有名为"Name“的小部件,或者不可能将UWidget*转换为UTextBlock*。你可能需要重新设计如何做到这一点。

票数 5
EN

Stack Overflow用户

发布于 2020-08-02 08:33:31

记住练习防御性编程!将ptr值初始化为nullptr --绝不假定变量是在C++中初始化的。代码if(Name)不检查UObject是否有效,它只是检查变量中是否有某个值--如果变量尚未初始化,该值将是一些垃圾值。

此外,我建议在取消引用变量之前检查变量(可能为null)。

根据UE4文档

GetWidgetFromName返回与给定名称对应的uobject小部件。

如果没有与给定名称相对应的uobject小部件(例如。由于所提供的文本中有错误或某些代码逻辑错误),UE4文档并不显式,而且我还没有亲自测试它,但我假设将返回nullptr。如果是这样的话,空返回将在if(Name)检查产生nullptr取消引用之后发生。

即。

代码语言:javascript
运行
复制
void UAccessWidgetFromCpp::F1(FString text)
{
    if (Name)
    {
        Name = (UTextBlock*)GetWidgetFromName(TEXT("Name"));
        // if there is no Widget with name "Name" then the variable Name 
        // may now be null even if it wasn't at the if check earlier
        Name->SetText(FText::FromString(text));
    }
}

希望澄清(将小部件变量命名为"Name“当然没有帮助)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63213610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档