Dim*_*zyr 3 c++ pointers casting c++11 unreal-engine4
我想调用函数,它会更改小部件内的文本。
有一个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));
}
}
Run Code Online (Sandbox Code Playgroud)
你UPROPERTY的一开始Name还没有初始化nullptr。因此,它可以在其中包含任何垃圾值。
nullptr在类定义或UAccessWidgetFromCpp(如果有)的构造函数中将其初始化为。例如,这将解决问题
UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
class UTextBlock* Name = nullptr;
// ^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
关于新的更新:
首先,您应该避免在 C++ 中使用 c 风格的强制转换。其次,该函数GetWidgetFromName返回一个给定名称对应的uobject 小部件。因此,您应该确保有一个带有“ Name”的。
否则,通过仔细检查nullptr场景来确保您的代码安全。
if(auto widget = dynamic_cast<UTextBlock*>(GetWidgetFromName(TEXT("Name"))))
{
Name = widget;
Name->SetText(FText::FromString(text));
}
Run Code Online (Sandbox Code Playgroud)
即使现在你没有达到行Name->SetText(FText::FromString(text));方式,无论你有没有部件被称为“ Name”或者是不可能投下UWidget*一个UTextBlock*。您可能需要重新设计如何执行此操作。