UE进阶实例39(UE ListView的使用C++)

ListView在C++代码中的使用,需要另外2个辅助类一个继承UObject的ItemHolder
另外一个是继承自UUserWidget的ItemCtrl
ItemHolder用于记录ListView中的数据,并非界面滴
ItemCtrl用于更新ListView的界面及数据

UE中ListView的关系
ListView:负责列表的主体功能
ListItem:列表显示项界面
ItemHolder:记录ListView中的数据
ItemCtrl:辅助操作ListView的更新(包括删除)
>>其中通常ListView由ListView自动处理,我们操作的是ItemHolder

界面使用
#1. 设置好一个尺寸,方便制作子条目
在这里插入图片描述
#2. 根据需求设置相关的功能
在这里插入图片描述
Orientation:ListView的方向
SelectionMode:条目的选择模式,单选或多选
ConsumeMouseWheel:数量多的时候使用滚轮条件
ClearSelectionOnClick:点击的时候清除选中
IsFocusable:是否可以聚焦
EntrySpacing:条目间距
ReturnFocustoSelection:返回焦点到选中

#3.制作的条目相关,为了美观
在这里插入图片描述
在这里插入图片描述
>>锚点使用中心
>>尺寸和ListView一致
>>对齐设置到中心
这样一套下来的效果
在这里插入图片描述



C++获取ListView实例
有两种方法,通过蓝图设置到C++中,或通过widget来查找
#1. 通过蓝图设置到C++中
在这里插入图片描述
在这里插入图片描述

在引用的MainWidget中定义调用方法
在这里插入图片描述
设置ListView为蓝图变量
在这里插入图片描述
赋值操作



添加数据C++
#1. 编写ListView需要的数据ItemHolder
在这里插入图片描述
>>此类需要在蓝图中使用,标记Blueprintable
#2. 编写列表更新类ItemCtrl
在这里插入图片描述
#3. 为ListView添加数据

	TArray<FString> ServerConf = gm->AllServerList();
	for (int i = 0; i < ServerConf.Num(); i ++)
	{
		UItemHolder* itemHolder = NewObject<UItemHolder>();
		itemHolder->StrIpPort = ServerConf[i];
		itemHolder->Index = i;
		itemHolder->IsConnected = false;

		s_ServerList->AddItem(itemHolder);

		GLog->Logf(TEXT("-------------------"));
	}

只要添加Holder到ListView,默认就添加了一个数据载体

#4. 将数据应用到界面
在这里插入图片描述
在这里插入图片描述
ListItem继承自UserObjectListEntry接口
在这里插入图片描述
在这里插入图片描述
实现接口中的回调方法,这里就是Add的数据



更新、删除列表数据C++

	UItemHolder* Holder = c_ItemMap[Port];
	if (UItemCtrl* Ctrl = Cast<UItemCtrl>(Holder->ItemCtrl))
	{
		Holder->IsConnected = true;
		Ctrl->UpdateItem(Holder);
	}

在这里插入图片描述

更新数据通过ItemCtrl中的蓝图实现类更新

	int32 NumItems = c_ClientList->GetNumItems();
	for (int i = 0; i < NumItems; ++i)
	{
		UItemHolder* Holder = Cast<UItemHolder>(c_ClientList->GetItemAt(i));
		UUserWidget* Widget = c_ClientList->GetEntryWidgetFromItem(Holder);
		if (UItemCtrl* Ctrl = Cast<UItemCtrl>(Widget))
		{
			Holder->IsConnected = false;
			Ctrl->UpdateItem(Holder);
		}
		//c_ClientList->RemoveItem(ItemAt); //remove will reset index by auto
	}

删除数据通过ItemCtrl中的RemoveItem(UObject* obj)来删除



附:UE中Object的Id定义

Unreal Engine中的UObject的Hash不同于std或普通面向对象语言的Hash值定义
因为Unreal Engine是封闭的,因此,对所有由Unreal Engine管理的UObject都是唯一的

/** 
 * Returns the unique ID of the object...these are reused so it is only unique while the object is alive.
 * Useful as a tag.
**/
FORCEINLINE uint32 GetUniqueID() const
{
	return (uint32)InternalIndex;
}

每一个UObject的子类都可以获取一个唯一Id

UItemHolder* itemHolder = NewObject<UItemHolder>();

创建UObject的方法,自动管理内存的呢




版权声明:本文为inspironx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。