如何绑定到列表视图的 OnItemSelectionChanged
How to bind to OnItemSelectionChanged of a list view
在虚幻引擎4中,我想将一个事件绑定到UListView::OnItemSelectionChanged
.该事件FOnItemSelectionChanged
需要一个NullableItemType
,所以我将指向列表视图的列表条目类(我的自定义类派生自IUserObjectListEntry
)的指针作为参数传递。
UCLASS()
class PROJECT_API UMyListViewEntry : public UUserWidget, public IUserObjectListEntry
{
GENERATED_BODY()
// Members and functions don't matter here.
};
UCLASS()
class PROJECT_API UMyUserWidget : public UUserWidget
{
GENERATED_BODY()
void NativeConstruct() final
{
MyList->OnItemSelectionChanged.AddDynamic(this, &UMyUserWidget::MyEventCallback);
}
void MyEventCallback(UMyListViewEntry* e)
{
// implementation details
}
private:
UPROPERTY(meta = (BindWidget))
UListView* MyList;
};
但是,AddDynamic()
调用会导致错误
C2228:".__Internal_AddDynamic"的左侧必须在类/结构/联合中
所以我想,我要绑定的回调函数(MyEventCallback()
)的签名是错误的。
应该绑定到UListView::OnItemSelectionChanged
的函数的正确签名是什么?
它不仅关乎回调的签名,还关乎如何添加回调。
选项 #1:使用 OnItemSelectionChanged 的返回值(回调将限制为 UObject)
在UListView
中,它的成员OnItemSelectionChanged
是通过宏IMPLEMENT_TYPED_UMG_LIST
实现的,它
virtual FOnItemSelectionChanged& OnItemSelectionChanged() const override { return OnItemSelectionChangedEvent; }
因此,若要向委托添加回调函数,请使用返回值:
UCLASS()
class PROJECT_API UMyUserWidget : public UUserWidget
{
GENERATED_BODY()
void NativeConstruct() final
{
auto event = MyList->OnItemSelectionChanged();
event.AddUObject(this, &UMyUserWidget::MyEventCallback);
}
void MyEventCallback(UObject* e)
{
// implementation details, cast e to UMyListViewEntry*
}
// ...
};
您仅限于将UObject*
作为参数的回调(UListView
是其基类的专用化,使用UObject
作为条目类型)。
蓝图(BP_OnItemSelectionChanged
)中可用的委托不能使用,因为它是私有的。
选项 #2:定义自定义委托
如果要在回调中直接使用自定义条目类型作为参数,则可以
- 实现您自己的列表视图或
- 派生自
UListView
并在virtual void OnSelectionChangedInternal(UObject* FirstSelectedItem)
中调用自定义委托
虽然第一种方法类似于UListView
实现,但第二种方法非常短,可能类似于BP_OnItemSelectionChanged
:
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnMyListItemSelectionChanged, UMyListViewEntry*, bool);
UCLASS(meta = (EntryInterface = UserObjectListEntry, EntryClass = UMyListViewEntry))
class PROJECT_API UMyListView : public UListView
{
GENERATED_BODY()
public:
FOnMyListItemSelectionChanged OnMyListItemSelectionChanged;
private:
void OnSelectionChangedInternal(UObject* FirstSelectedItem) override
{
Super::OnSelectionChangedInternal(FirstSelectedItem);
auto entry = Cast<UMyListViewEntry>(FirstSelectedItem);
OnMyListItemSelectionChanged.Broadcast(entry, entry != nullptr);
}
};
UCLASS()
class PROJECT_API UMyUserWidget : public UUserWidget
{
GENERATED_BODY()
void NativeConstruct() final
{
MyList->OnMyListItemSelectionChanged.AddUObject(this, &UMyUserWidget::MyEventCallback);
}
void MyEventCallback(UMyListViewEntry* e, bool isSelected)
{
// implementation details
}
private:
UPROPERTY(meta = (BindWidget), meta = (EntryClass = UMyListViewEntry))
UMyListView* MyList;
};
相关文章:
- 列表视图更改选择颜色
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 列表视图项的替代颜色
- 如何将 QString 的 QList 分配给列表视图?
- 如何修复列表视图中的错误?,封装控件时无法选择任何项
- 如何在 c++ 中从列表视图中获取值
- Qml 列表视图在重置模型时保留视图
- 创建列表视图后无法更改列表视图中的列宽
- 如何在调整列表视图大小时将标题宽度设置为等于其列表视图控件宽度
- 如何更改列表视图的边框颜色
- Qt:将 c++ 中的列表连接到 QML 中的列表视图
- 如何绑定到列表视图的 OnItemSelectionChanged
- 列表视图最初不显示数据
- 从C++访问列表视图委托的文本
- LVM_GETNEXTITEM在列表视图中找不到项目
- UWP 列表视图占用的高度超过可用高度
- 如何在移动列表视图中添加滚动条?并且用户只能垂直滚动特定区域
- C++ win32 列表视图列
- QML 列表视图和密钥导航 - 处理单个密钥事件
- 循环访问列表视图项 win32 api