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的方法,自动管理内存的呢