我想调用函数,它会更改小部件内的文本。
有一个虚拟
函数NativeConstruct
,它会自动调用。它会更改小部件的文本,但我需要调用函数 F1
并向它发送一个我想要显示的文本。但是当我调用它时,变量Name
是nullptr
。由于某些原因,当程序调用NativeConstruct
时,它不是nullptr
。
Name
是我要更改的文本变量dialogBottom
是带有此变量的小部件的名称
已编辑
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));
}
}
最佳答案
您的 UPROPERTY
Name
一开始没有初始化为 nullptr
。因此,它可能包含 any garbage value inside it .
在类定义或UAccessWidgetFromCpp
(如果有)的构造函数中将其初始化为nullptr
。例如,这将解决问题
UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
class UTextBlock* Name = nullptr;
// ^^^^^^^^^^
关于新的更新:
首先,你应该avoid using c-style casting in C++ .其次,函数GetWidgetFromName
返回与给定名称对应的 uobject 小部件。因此,您应该确保使用“Name
”。
否则,通过仔细检查 nullptr
场景来确保您的代码安全。
if(auto widget = dynamic_cast<UTextBlock*>(GetWidgetFromName(TEXT("Name"))))
{
Name = widget;
Name->SetText(FText::FromString(text));
}
即使现在您还没有到达 Name->SetText(FText::FromString(text));
行,这意味着您没有名为“Name
”的小部件或无法将 UWidget*
转换为 UTextBlock*
。您可能需要重新设计如何执行此操作。
关于c++ - 为什么虚幻引擎中的变量为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63213610/