BindWidget variable is null (source code, debug)

Hi, i have some problem with my widget.

Untitled

this is ‘WBP_NewItem’ widget
and check ‘is variable’

in class setting, set parent class ‘NewItemWidget’

//NewItemWidget.h
class OPENWORLDRPG_API UNewItemwidget : public UUserWidget
{
	UPROPERTY(EditDefaultsOnly, Category = "WidgetVariable", meta = (BindWidget))
	USizeBox* BGSizeBox;

	UPROPERTY(EditDefaultsOnly, Category = "WidgetVariable", meta = (BindWidget))
	UBorder* BGBorder;

	UPROPERTY(EditDefaultsOnly, Category = "WidgetVariable", meta = (BindWidget))
	UImage* ItemIcon;

	void Refresh();

};


and this widget created by ‘NewInventoryGrid’
this is also derived from UUserWidget class.

//NewInventoryGrid.cpp
void UNewInventoryGrid::RefreshInventory()
{
	//...
		const auto ItemsMap = InventoryComp->GetAllItems();

		for (auto ele : ItemsMap)
		{
			//Create NewItemWidget, but all the bind variable is null.
			UNewItemwidget* ItemWidget = CreateWidget<UNewItemwidget>(GetOwningPlayer(), UNewItemwidget::StaticClass());
			if (ItemWidget != nullptr)
			{
				ItemWidget->OnRemoved.AddUFunction(this, FName("OnItemRemove"));

                //Initialize variable
				ItemWidget->Tilesize = TileSize;
				ItemWidget->ItemObj = ele.Key;

				ItemWidget->Refresh();
				//...
			}
		}
}

here is debug


Right after create widget.


And this is after Initialize variable.

how can i use BindWidget with CreateWidget??

1 Like

You’ve declared that the objects are there, but you haven’t actually created them in the construction code for your widget


You should use this in RebuildWidget

1 Like

Try changing your header to this, what you have should work:

#include "Runtime/UMG/Public/UMG.h"
#include "Runtime/UMG/Public/UMGStyle.h"
#include "Runtime/UMG/Public/Slate/SObjectWidget.h"
#include "Runtime/UMG/Public/IUMGModule.h"
#include "Runtime/UMG/Public/Blueprint/UserWidget.h"

UCLASS()
class OPENWORLDRPG_API UNewItemwidget : public UUserWidget
{
	GENERATED_BODY()

public:

//your stuff ...
1 Like

i tried changing in both header, but it didn’t work.
(NewItemWidget.h, NewInventoryGrid.h)

You need to do the following:

public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets") TSubclassOf<class UUserWidget> HealthWidgetTemplate;


private:
UPROPERTY() UHealthWidget* HealthWidget;

Then in your code you can create it:

if(HealthWidgetTemplate){
    HealthWidget = CreateWidget<UHealthWidget>(this, HealthWidgetTemplate, FName("MyName"));
}
1 Like
//MyController.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets | Inventory")
TSubclassOf<UUserWidget> WItemwidget;

//NewInventoryGrid.cpp
void UNewInventoryGrid::RefreshInventory()
{
//...
	UNewItemwidget* testwidget = ConstructWidget<UNewItemwidget>(MainCon->WItemwidget);

	if (testwidget != nullptr)
	{
		testwidget->Tilesize = TileSize;
		testwidget->ItemObj = ele.Key;
	}
//...
}

I put that code in NewInventoryGrid.h but still the variable null.

did i do it right?

Try CreateWidget<> instead of ConstructWidget<>

CreateWidget<UNewItemwidget>(this, MainCon->WItemwidget, FName("whatever"));
1 Like
//NewInventoryGrid.h

	UPROPERTY(EditDefaultsOnly, Category = "WidgetVariable")
	TSubclassOf<UUserWidget> WNewItemWidget = nullptr;

	UNewItemwidget* newitemwidget;

//NewInventoryGrid.cpp
void UNewInventoryGrid::RefreshInventory()
{
	//...
			newitemwidget = CreateWidget<UNewItemwidget>(this, WNewItemWidget);

			if (newitemwidget)
			{
				newitemwidget->Tilesize = TileSize;
				newitemwidget->ItemObj = ele.Key;
				newitemwidget->Refresh();
			}
}

//NewItem.h
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"

#include "Runtime/UMG/Public/UMG.h"
#include "Runtime/UMG/Public/UMGStyle.h"
#include "Runtime/UMG/Public/Slate/SObjectWidget.h"
#include "Runtime/UMG/Public/IUMGModule.h"
#include "Runtime/UMG/Public/Blueprint/UserWidget.h"

#include "NewItemwidget.generated.h"
class OPENWORLDRPG_API UNewItemwidget : public UUserWidget
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadOnly)
	UNewItemObject* ItemObj;
	UPROPERTY(BlueprintReadOnly)
	float Tilesize;
	UPROPERTY(BlueprintReadOnly)
	FVector2D widgetsize;
	//...
	UPROPERTY(BlueprintReadOnly, Category = "WidgetVariable", meta = (BindWidget))
	USizeBox* BGSizeBox;

	UPROPERTY(BlueprintReadOnly, Category = "WidgetVariable", meta = (BindWidget))
	UBorder* BGBorder;

	UPROPERTY(BlueprintReadOnly, Category = "WidgetVariable", meta = (BindWidget))
	UImage* ItemIcon;

asdfasdf

i put NewItem widget template in NewInventoryGrid widget.
but still bindwidget variable is null.

OOOOOOOHHHHHHHHHHH WOW!!
thank you for solution.

i was putting native widget file in widget template variable.

omg. i’m so stupid.
asdfasdf

Thank you for your reply. thank you thank you.

i hope you’ll always be happy.

4 Likes

TOTAL longshot here with the time since you posted this. but it looks like you are working over the same tutorial as me, for a spatial inventory. Converting from the blueprint in the tutorial to cpp as I am. Any Chance I could see all of what you wrote for the conversion? It would be super helpful for me to see a working cpp version.

Hi there, I was working on the cpp version of the Spatial Inventory System few days ago and found your post. I have completed it and upload it to github. Feel free to download it: GitHub - PhoeniFOX/UE5-Spatial-Inventory-CPP: UE5.3 C++ version of Spatial Inventory System based on tutorial of Reids Channel. The Link of original Blueprint tutorial is: https://www.youtube.com/watch?v=4CjpBoKl6s8 :smiley: