使用 IDetailCustomization 的方式可以给 UE 的属性面板添加特殊的东西,比如按钮。
以给 F 的结构的 Detail 添加按钮的方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 #pragma  once #include  "IDetailCustomization.h"  class  FReleaseSettingsDetails  :  public  IDetailCustomization{ public :         static  TSharedRef<IDetailCustomization> MakeInstance ()  ;          virtual  void  CustomizeDetails (IDetailLayoutBuilder& DetailBuilder)  override  ; }; 
 
.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 #include  "CreatePatch/ReleaseSettingsDetails.h"  #include  "CreatePatch/FExportReleaseSettings.h"  #include  "DetailLayoutBuilder.h"  #include  "DetailCategoryBuilder.h"  #include  "DetailWidgetRow.h"  #include  "Widgets/Input/SButton.h"  #define  LOCTEXT_NAMESPACE "ReleaseSettingsDetails"  TSharedRef<IDetailCustomization> FReleaseSettingsDetails::MakeInstance ()   {    return  MakeShareable (new  FReleaseSettingsDetails ()); } void  FReleaseSettingsDetails::CustomizeDetails (IDetailLayoutBuilder& DetailBuilder)  {    TArray< TSharedPtr<FStructOnScope> > StructBeingCustomized;     DetailBuilder.GetStructsBeingCustomized (StructBeingCustomized);     check (StructBeingCustomized.Num () == 1 );          FExportReleaseSettings* ReleaseSettingsIns = (FExportReleaseSettings*)StructBeingCustomized[0 ].Get ()->GetStructMemory ();          IDetailCategoryBuilder& VersionCategory = DetailBuilder.EditCategory ("Version" ,FText::GetEmpty (),ECategoryPriority::Default);     VersionCategory.SetShowAdvanced (true );          VersionCategory.AddCustomRow (LOCTEXT ("ImportPakLists" , "Import Pak Lists" ),true )         .ValueContent ()         [             SNew (SHorizontalBox)             + SHorizontalBox::Slot ()             .Padding (0 )             .AutoWidth ()             [                 SNew (SButton)                 .Text (LOCTEXT ("Import" , "Import" ))                 .ToolTipText (LOCTEXT ("ImportPakLists_Tooltip" , "Import Pak Lists" ))                 .IsEnabled_Lambda ([this ,ReleaseSettingsIns]()->bool                  {                     return  ReleaseSettingsIns->IsByPakList ();                 })                 .OnClicked_Lambda ([this , ReleaseSettingsIns]()                 {                     if  (ReleaseSettingsIns)                     {                         ReleaseSettingsIns->ImportPakLists ();                     }                     return  (FReply::Handled ());                 })             ]             + SHorizontalBox::Slot ()             .Padding (5 ,0 ,0 ,0 )             .AutoWidth ()             [                 SNew (SButton)                 .Text (LOCTEXT ("Clear" , "Clear" ))                 .ToolTipText (LOCTEXT ("ClearPakLists_Tooltip" , "Clear Pak Lists" ))                 .IsEnabled_Lambda ([this ,ReleaseSettingsIns]()->bool                  {                     return  ReleaseSettingsIns->IsByPakList ();                 })                 .OnClicked_Lambda ([this , ReleaseSettingsIns]()                 {                     if  (ReleaseSettingsIns)                     {                         ReleaseSettingsIns->ClearImportedPakList ();                     }                     return  (FReply::Handled ());                 })             ]         ]; } #undef  LOCTEXT_NAMESPACE 
 
这里我们只是定义了一个 IDetailCustomization 的类,其中的 CustomizeDetails 是对 FExportReleaseSettings 添加的细节。
该类在创建 DetailView 时使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 void  SHotPatcherExportRelease::CreateExportFilterListView ()  {	 	FPropertyEditorModule& EditModule = FModuleManager::Get ().GetModuleChecked<FPropertyEditorModule>("PropertyEditor" ); 	FDetailsViewArgs DetailsViewArgs; 	{ 		DetailsViewArgs.bAllowSearch = true ; 		DetailsViewArgs.bHideSelectionTip = true ; 		DetailsViewArgs.bLockable = false ; 		DetailsViewArgs.bSearchInitialKeyFocus = true ; 		DetailsViewArgs.bUpdatesFromSelection = false ; 		DetailsViewArgs.NotifyHook = nullptr ; 		DetailsViewArgs.bShowOptions = true ; 		DetailsViewArgs.bShowModifiedPropertiesOption = false ; 		DetailsViewArgs.bShowScrollBar = false ; 		DetailsViewArgs.bShowOptions = true ; 		DetailsViewArgs.bUpdatesFromSelection= true ; 	} 	FStructureDetailsViewArgs StructureViewArgs; 	{ 		StructureViewArgs.bShowObjects = true ; 		StructureViewArgs.bShowAssets = true ; 		StructureViewArgs.bShowClasses = true ; 		StructureViewArgs.bShowInterfaces = true ; 	} 	SettingsView = EditModule.CreateStructureDetailView (DetailsViewArgs, StructureViewArgs, nullptr ); 	FStructOnScope* Struct = new  FStructOnScope (FExportReleaseSettings::StaticStruct (), (uint8*)ExportReleaseSettings.Get ()); 	SettingsView->GetOnFinishedChangingPropertiesDelegate ().AddRaw (ExportReleaseSettings.Get (),&FExportReleaseSettings::OnFinishedChangingProperties); 	SettingsView->GetDetailsView ()->RegisterInstancedCustomPropertyLayout (FExportReleaseSettings::StaticStruct (),FOnGetDetailCustomizationInstance::CreateStatic (&FReleaseSettingsDetails::MakeInstance)); 	SettingsView->SetStructureData (MakeShareable (Struct)); } 
 
使用 RegisterInstancedCustomPropertyLayout 把所写的 FReleaseSettingsDetails 实例注册到 DetailView 中。注意调用时机要在 SetStructureData 之前。 然后就可以看到添加的两个按钮了: