UE笔记---绑定代理事件

来源:互联网 发布:董小飒淘宝零食店 编辑:程序博客网 时间:2024/05/16 12:32


一、UUserWidget子类中绑定 SWidget 代理事件
代码示例:两种方法都可以
宏展开
#define BIND_UOBJECT_DELEGATE(Type, Function) \
Type::CreateUObject( this, &ThisClass::Function )


void UUMGContentBrowser::ConstructCategoryTree(){TSharedPtr<SScrollBox> LevelScrollBoxTree = StaticCastSharedPtr<SScrollBox>(ScrollBox_Level->GetCachedWidget());TSharedPtr<SCategoryButton> NewEntry =SNew(SCategoryButton).Text(FText::FromString(TEXT("全部"))).CategoryTreeLevel(ECategoryTreeLevel::CTL_ALL).Level1Index(-1).Level2Index(-1)//.OnCategoryTreeClicked(BIND_UOBJECT_DELEGATE(FOnCategoryTreeClickedDelegate, Callback_OnCategoryTreeClicked));.OnCategoryTreeClicked(FOnCategoryTreeClickedDelegate::CreateUObject(this, &UUMGContentBrowser::Callback_OnCategoryTreeClicked));LevelScrollBoxTree->AddSlot().Padding(FMargin(0, 5, 0, 0))[NewEntry.ToSharedRef()];}


二、SLate子类中绑定代理事件
代码示例:来自于UE SEditorTutorials.cpp 类
绑定的方法都是 SWidget 子类中的方法 
OnBackClicked(FSimpleDelegate::CreateSP(this, &SEditorTutorials::HandleBackClicked))


void SEditorTutorials::RebuildCurrentContent(){UEditorTutorial* CurrentTutorial = OnGetCurrentTutorial.Execute();int32 CurrentTutorialStage = OnGetCurrentTutorialStage.Execute();OverlayContent = nullptr;ContentBox->ClearChildren();if(CurrentTutorial != nullptr && CurrentTutorialStage < CurrentTutorial->Stages.Num()){ContentBox->AddSlot()[SAssignNew(OverlayContent, STutorialOverlay, CurrentTutorial, &CurrentTutorial->Stages[CurrentTutorialStage]).OnClosed(FSimpleDelegate::CreateSP(this, &SEditorTutorials::HandleCloseClicked)).IsStandalone(CurrentTutorial->bIsStandalone).ParentWindow(ParentWindow).AllowNonWidgetContent(bIsNavigationWindow).OnBackClicked(FSimpleDelegate::CreateSP(this, &SEditorTutorials::HandleBackClicked)).OnHomeClicked(FSimpleDelegate::CreateSP(this, &SEditorTutorials::HandleHomeClicked)).OnNextClicked(FSimpleDelegate::CreateSP(this, &SEditorTutorials::HandleNextClicked)).IsBackEnabled(this, &SEditorTutorials::IsBackButtonEnabled).IsHomeEnabled(this, &SEditorTutorials::IsHomeButtonEnabled).IsNextEnabled(this, &SEditorTutorials::IsNextButtonEnabled).OnWidgetWasDrawn(OnWidgetWasDrawn).OnWasWidgetDrawn(OnWasWidgetDrawn)];}else{// create 'empty' overlay, as we may need this for picking visualizationContentBox->AddSlot()[SAssignNew(OverlayContent, STutorialOverlay, nullptr, nullptr).OnClosed(FSimpleDelegate::CreateSP(this, &SEditorTutorials::HandleCloseClicked)).IsStandalone(false).ParentWindow(ParentWindow).AllowNonWidgetContent(false)];}}


三、自定义方法中绑定事件


方法参数为代理事件 FOnCheckStateChanged

// Checkvoid AddCheckBoxBlock(const FString& InBlockID, EWidgetType::Type InType, const FText& InText, const FOnCheckStateChanged& InOnCheckStateChanged = FOnCheckStateChanged()){TSharedRef< FDetailEntryBlock > EntryBlock(new FDetailEntryBlock());EntryBlock->BlockID = InBlockID;EntryBlock->Type = InType;EntryBlock->Text = InText;EntryBlock->OnCheckStateChanged = InOnCheckStateChanged;DetailBuilderList.Add(EntryBlock);}FDetailBuilder DetailBuilder;DetailBuilder.AddCheckBoxBlock(TEXT("Check1"),EWidgetType::WT_TEXTBLOCK_CHECK,FText::FromString(TEXT("开启空间名")),FOnCheckStateChanged::CreateUObject(this, &ATutorialsPlayerController::OnCheckStateChangedEvent1));






原创粉丝点击