Umg2.编辑器工具控件样式DetailsView
大约 5 分钟
编辑器工具控件
DetailsView
多语言注意事项
委托触发修改
代码分析
-UDetailsView : public UPropertyViewBase, public FNotifyHook
-UPropertyViewBase : public UWidget
//①一个参数的动态多播委托
/** Sets a delegate called when the property value changes */
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPropertyValueChanged, FName, PropertyName);
//②这个就是蓝图事件函数节点
/** Sets a delegate called when the property value changes */
UPROPERTY(BlueprintAssignable, Category = "View|Event")
FOnPropertyValueChanged OnPropertyChanged;
//③ 代理函数声明
void OnPropertyChangedBroadcast(FName PropertyName);
//④代理函数定义
void UPropertyViewBase::OnPropertyChangedBroadcast(FName PropertyName)
{
OnPropertyChanged.Broadcast(PropertyName);
}
//⑤使用者调用
void UDetailsView::NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FProperty* PropertyThatChanged)
{
FNotifyHook::NotifyPostChange(PropertyChangedEvent, PropertyThatChanged);
// 获取发生变化的属性的名称
FName PropertyName = PropertyThatChanged ? PropertyThatChanged->GetFName() : NAME_None;
// 触发委托广播,通知已注册的监听者属性已经发生了变化
OnPropertyChangedBroadcast(PropertyName);
}
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam
宏:- 这是一个宏,用于声明带有一个参数的动态多播委托。
FOnPropertyValueChanged
是委托的类型名称,表示当某个属性值发生变化时触发的事件。在这里,FName
是参数类型,表示属性的名称。
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPropertyValueChanged, FName, PropertyName);
- 这是一个宏,用于声明带有一个参数的动态多播委托。
UPROPERTY(BlueprintAssignable)
宏:- 这是UE宏,用于声明一个在蓝图中可绑定的委托实例。
OnPropertyChanged
是类的成员变量,它是FOnPropertyValueChanged
委托的实例。
UPROPERTY(BlueprintAssignable, Category = "View|Event") FOnPropertyValueChanged OnPropertyChanged;
- 这是UE宏,用于声明一个在蓝图中可绑定的委托实例。
委托函数
OnPropertyChangedBroadcast
:- 这是一个成员函数,用于在属性值发生变化时触发委托的广播。该函数接受一个类型为
FName
的参数PropertyName
,表示发生变化的属性的名称。
void OnPropertyChangedBroadcast(FName PropertyName);
- 这是一个成员函数,用于在属性值发生变化时触发委托的广播。该函数接受一个类型为
函数实现
UPropertyViewBase::OnPropertyChangedBroadcast
:- 这是
OnPropertyChangedBroadcast
函数的具体实现。在这里,通过OnPropertyChanged.Broadcast(PropertyName);
触发委托的广播,通知已注册的监听者(可能是蓝图中的事件节点或其他代码)属性值已经发生了变化。
void UPropertyViewBase::OnPropertyChangedBroadcast(FName PropertyName) { OnPropertyChanged.Broadcast(PropertyName); }
- 这是
UDetailsView::NotifyPostChange
的使用者:NotifyPostChange
是一个虚函数,并在UDetailsView
中被重写。以下是声明:
virtual void NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FProperty* PropertyThatChanged) override;