我想调用函数,它改变了小部件中的文本。
有一个virtual
函数NativeConstruct
,它自动调用。它改变了小部件的文本,但是我需要调用函数F1
并发送一个文本给它,我想要显示它。但是当我调用它时,变量Name
是nullptr
。由于某种原因,当程序调用nullptr
时,它不是NativeConstruct
。
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));
}
}
发布于 2020-08-02 08:01:50
您的UPROPERTY
-- Name
--在开始时没有初始化为nullptr
。因此,它可以包含里面的任何垃圾值。
在类定义或UAccessWidgetFromCpp
的构造函数中将其初始化为UAccessWidgetFromCpp
(如果有的话)。例如,这将解决问题。
UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
class UTextBlock* Name = nullptr;
// ^^^^^^^^^^
关于新的更新:
首先,您应该使用避免在C++中使用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*
。你可能需要重新设计如何做到这一点。
发布于 2020-08-02 08:33:31
记住练习防御性编程!将ptr值初始化为nullptr --绝不假定变量是在C++中初始化的。代码if(Name)
不检查UObject是否有效,它只是检查变量中是否有某个值--如果变量尚未初始化,该值将是一些垃圾值。
此外,我建议在取消引用变量之前检查变量(可能为null)。
GetWidgetFromName
返回与给定名称对应的uobject小部件。
如果没有与给定名称相对应的uobject小部件(例如。由于所提供的文本中有错误或某些代码逻辑错误),UE4文档并不显式,而且我还没有亲自测试它,但我假设将返回nullptr
。如果是这样的话,空返回将在if(Name)
检查产生nullptr取消引用之后发生。
即。
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“当然没有帮助)。
https://stackoverflow.com/questions/63213610
复制相似问题