UE4右键菜单(上篇ContentBrowser的补充)

2023-11-18

在上篇中我们讲到拓展我们的ContentBrowser的文件夹右键菜单。看回上篇代码可以发现其实真正起实现拓展(看到效果)的代码就只有一行。
在这里插入图片描述
在代码中我们可以看到 MenuBuilder 这个东西是可以为我们创建一个菜单的,今天我们继续来改造它。首先我们先来看看效果。
在这里插入图片描述
第一个是弹出的小菜单,这次我们在C++中写好将它开放到蓝图里面,需要生成的菜单名称和按钮点击的逻辑全部在蓝图层面完成;第二个是我们比较熟悉的ContentBrowser文件夹浏览器,今天我们将它提取出来。有时候我们制作一些带界面的插件也需要进行文件夹选择功能这个时候就要用到这个文件夹浏览器了。

废话结束
首先我们在项目里面创建C++的蓝图函数库 这里名称可以随意(我这边的命名 ToolFunctionLibrary )
在这里插入图片描述
接下来就贴上代码
.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "SlateApplication.h"
#include "ToolFunctionLibrary.generated.h"

DECLARE_DYNAMIC_DELEGATE_OneParam(FUIActionClick,FString,UILabel);
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSelectChange,const FString&,Path);

/**
 * 
 */
UCLASS()
class UToolFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
public:
	/*
	*	创建一个PickerBrowser(和ContentBrowser 中的文件夹浏览器一样)
	* 
	*	@param InParentWidget	父类控件表示这个弹出的菜单是属于那个UI控件里面的
	*	@param OnSelectChange	这个是一个带一个参数的动态代理(动态代理支持在蓝图中绑定事件)这个代理将会在我们选择文件夹时进行回调
	*/
	UFUNCTION(BlueprintCallable)
		static void CreatePickerBrowser(UUserWidget* InParentWidget, FOnSelectChange OnSelectChange);
		
	/*
	*	创建一个弹出的菜单(可应用到右键弹出快截菜单中)
	*	@param InParentWidget  父类控件表示这个弹出的菜单是属于那个UI控件里面的
	*   @param LabelArr        这个是你要创建的菜单的名称的数组例如我想创建多个菜单就在这个数组里面添加多个菜单的名称就好了
	*   @param ActionDel       这个是一个带一个参数的动态代理(动态代理支持在蓝图中绑定事件) 这个代理将会在菜单被点击时进行回调
	*/
	UFUNCTION(BlueprintCallable)
		static void OpenTextureMenu(UWidget* InParentWidget, const TArray<FString>& LabelArr, FUIActionClick ActionDel);
private:
	static TSharedPtr<IMenu> PickerMenu;
};

.cpp

#include "ToolFunctionLibrary.h"
#include "ContentBrowser/Public/ContentBrowserModule.h"
#include "ModuleManager.h"
#include "ContentBrowser/Public/IContentBrowserSingleton.h"


//这里要初始化一下静态变量
TSharedPtr<IMenu> UToolFunctionLibrary::PickerMenu = NULL;  

void UToolFunctionLibrary::CreatePickerBrowser(UUserWidget* InParentWidget, FOnSelectChange OnSelectChange)
{
	//国际惯例既然是内容浏览器的东西肯定要拿到 ContentBrowser 这个模块
	FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
	//创建一份路径选择的一个结构体 这个结构体里面包含了一些路径选择器的一些参数以及回调内容
	FPathPickerConfig PathPickerConfig;
	//这个路径选择器的每个文件夹是否拥有右键菜单
	PathPickerConfig.bAllowContextMenu = false;
	//路径选择变更时的回调
	PathPickerConfig.OnPathSelected = FOnPathSelected::CreateLambda([OnSelectChange](const FString& Path){
		//判断是否有效
		if (PickerMenu.IsValid())
		{
			//关闭控件
			PickerMenu->Dismiss();
			//共享指针重置 引用计数归0
			PickerMenu.Reset();
		}
		//回调到蓝图的绑定事件
		OnSelectChange.ExecuteIfBound(Path);
	});
	//第一个参数点击之后是否关闭控件 在这里是不生效的因为我们点击的不是MenuBuilder创建出来的Menu
	//我们在这里只是利用了MenuBuilder当一个容器实际点击的还是 ContentBrowserModule.Get().CreatePathPicker(PathPickerConfig) 里创建的控件
	FMenuBuilder MenuBuilder(true, NULL);
	//在这个菜单构建器中添加 Slate 控件
	//创建一个Sobx 对应UMG的Size Box 
	MenuBuilder.AddWidget(SNew(SBox) 
		.WidthOverride(300.0f)
		.HeightOverride(300.0f)
		[
			//创建一个路径选择器放在Size box 下面
			ContentBrowserModule.Get().CreatePathPicker(PathPickerConfig)
		], FText());

	//将这个创建好的控件显示到我们的UI上
	PickerMenu = FSlateApplication::Get().PushMenu(InParentWidget->TakeWidget(), //父控件
		FWidgetPath(),
		MenuBuilder.MakeWidget(), //要显示的控件
		FSlateApplication::Get().GetCursorPos(), // 创建在什么位置这里我们直接获取当前鼠标的位置就好了
		FPopupTransitionEffect(FPopupTransitionEffect::ContextMenu)
	);
}

void UToolFunctionLibrary::OpenTextureMenu(UWidget* InParentWidget,const TArray<FString>& LabelArr, FUIActionClick ActionDel)
{
	//第一个参数点击后是否关闭这里能实际生效
	FMenuBuilder MenuBuilder(true, NULL);
	for(int i=0;i<LabelArr.Num();i++)
	{
		//这里特别说明要创建一个共享指针,不然出了这个函数作用域 fstring 就不生效了等我们回调时使用到这个Fstring 就会奔溃。
		TSharedPtr<FString> TempString = MakeShareable(new FString(LabelArr[i]));
		MenuBuilder.AddMenuEntry(FText::FromString(*TempString.Get()), FText(), FSlateIcon(), 
		FUIAction(FExecuteAction::CreateLambda([TempString,ActionDel]() { //UI点击事件
			ActionDel.ExecuteIfBound(*TempString.Get());
		})));
	}
	
	//这里跟上面的路径选择器创建一样
	FSlateApplication::Get().PushMenu(InParentWidget->TakeWidget(),
		FWidgetPath(),
		MenuBuilder.MakeWidget(),
		FSlateApplication::Get().GetCursorPos(),
		FPopupTransitionEffect(FPopupTransitionEffect::ContextMenu)
	);
}

回到蓝图我们写调用方法

第一个功能

上图演示中第一个功能其实是一张Image的右键菜单我们可以在这个Image 控件的Mouse button down 方法里面这样调用并在事件图标里面写一个叫UIMenuAction带传入Fstring的事件 在这个事件里面我们可以处理按钮点击的逻辑
在这里插入图片描述

第二个功能

第二个功能的逻辑很简单 回调回来的Fstring就是点击是所选的路径
在这里插入图片描述

最后

本文旨在记录学习过程和分享,如有错误请帮我指出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4右键菜单(上篇ContentBrowser的补充) 的相关文章

随机推荐

  • 如何通过谷歌云平台设置load balancing 和CDN

    1 创建instance templates 实例模板 首先 创建一个实例模板来启动一个在负载均衡器后面充当应用服务器的实例 在这个演示中 我们不会在实例中实际启动 Web 应用程序 相反 将 Apache HTTP Server 配置为在
  • 人工智能方向毕业设计_人工智能时代,理工科专业的毕业设计都被安排了

    我是16年上半年从软件开发转到算法工程师的 这些年AI 我亲眼见证了从 黑科技 跌入 俗学 的过程 早些年 在模式识别领域 例如人脸识别 语音识别等 大家都发力在数学算法 基于机器学习 的时候 虽然努力多年 但是因为技术缺陷精度却一直上不去
  • Oracle数据库的闪回技术

    当 Oracle 数据库发生逻辑损坏时 可以使用闪回技术简单快捷地进行数据库的恢复 闪回数据库使用闪回日志执行闪回 闪回删除使用回收站 其它所有技术都使用还原数据 并不 是所有闪回功能都会修改数据库 有些功能只是一些用来查询数据以往版本的方
  • 左程云 Java 笔记--链表

    文章目录 1哈希表 2有序表 3链表 3 1打印两个有序链表的公共部分 3 2判断一个链表是否为回文结构 3 3将单向链表按某值划分成左边小 中间相等 右边大的形式 3 4复制含有随机指针节点的链表 3 4 1使用哈希表 3 4 2方法二
  • Tachyou alluxio初识

    Tachyou是基于内存的分布式文件系统 如果把hdfs上层再弄一层Tachyou去存储数据 那么速度将会更快 Tachyou现在改名为Tachyou alluxio
  • 【数字电源】数字电源核心理论-"伏妙平衡"与"安秒平衡"

    1 聊一聊 今天跟大家分享的是迈克在本公众号的第三首歌曲 在bug菌心里迈克的歌早就不仅仅只是一首歌曲了 更是件值得一直品味的艺术品 本文开启数字电源的第一篇原创文章 数字电源核心理论 伏秒和安秒平衡 2 主题前言 在公众号简介中bug菌跟
  • 为什么要进行埋点?如何理解数据埋点

    我们在做网站运营 APP运营的时候 要关注事件级分析 比如按钮点击事件 漏斗转化率 只看PV UV是无法得到行动指导的 UV多了一点少了一点 无法能反映出来 我们流量的多与少 与用户真正的完成转化还差很多 举例 我们想看加入购物车和提交订单
  • Qt中 gui 模块和 widgets 模块的区别

    1 gui 模块提供了基本的图形系统抽象层 包括QPaintDevice QPainter等类 这些类构成了Qt的绘图基础 2 widgets 模块在 gui 模块的基础上 提供了完整的桌面级用户界面控件 如按钮 列表 滑块等 这些控件继承
  • VS最新安装教程

    1 访问Visual Studio官方网站 下载 Visual Studio Tools 免费安装 Windows Mac Linux microsoft com https visualstudio microsoft com zh ha
  • .NET 发展历程

    早期 NET NET Framework 1 0 4 8 1 时间 2002 02 2019 04 2002 年 2 月 23 日最早的 NET Framework 1 0 发布 终止于 2022 年 8 月 9 日发布的 NET Fram
  • ie11对象不支持此属性和方法 ie11的缓存问题

    更改eclipse的js代码 在ie11上调试 发现调用新更改的方法 在ie11的console输出里 一直提示 对象不支持此属性和方法 点击右上角设置图标 然后点击Internet选项 在常规选项卡里的 浏览器历史记录 点击设置 在弹出的
  • 【分布式系统搭建】Zookeeper完全分布式集群的搭建

    Zookeeper完全分布式集群的搭建 一 集群模式 1 单机模式 用于测试环境 在zoo cfg中只配置一个server id就是单机模式了 2 伪分布式 用于测试环境 在zoo cfg中配置多个server id 其中ip都是当前机器
  • AntV-f2开发文档

    安装 浏览器引入 复制代码 npm 安装 安装 npm install antv f2 save复制代码 引入 const F2 require antv f2 复制代码 上手 步骤 创建 Chart 图表对象 指定图表 ID 指定图表的宽
  • Qt开发经验(转载)

    0 前言说明 本文转载于https qtchina blog csdn net type blog feiyangqingyun的博客 感谢大佬的经验分析 1 开发经验 01 001 010 当编译发现大量错误的时候 从第一个看起 一个一个
  • C++ 常量引用

    黑马程序员C P94 常量引用 感觉这部分有很多内容 但目前我的理解就是在形参前加上const 防止误操作 先占个坑后面再补充
  • 第二章节:期货市场组织结构与投资者

    各组织的性质 职能 形式 组织架构 权利 义务等 期货结算制度 期货投资者种类等 第一节 期货交易所 本节考点 一 期货交易所的性质 宗旨与职能 重点掌握 二 期货交易所的组织结构 重点掌握 三 我国境内期货交易所 重点掌握 一 期货交易所
  • Java中的static关键字解析

    一 static关键字的用途 在 Java编程思想 P86页有这样一段话 static方法就是没有this的方法 在static方法内部不能调用非静态方法 反过来是可以的 而且可以在没有创建任何对象的前提下 仅仅通过类本身来调用static
  • HDU-7304 2023“钉耙编程”杭电多校赛(3)Out of Control

    2023 钉耙编程 中国大学生算法设计超级联赛 3 Out of Control 题目大意 有 n n n个数 x 1 x
  • 区块链三加一:深度论区块链的联盟链意义与作用

    随着区块链技术的发展 越来越受个人及企业的关注 而和区块链联系最为紧密的 恐怕就是金融行业了 然而虽然区块链大受热捧 但毕竟区块链是属于公有区块链 公有区块链有着其不可编辑 不可篡改的特点 这就使得公有链并不适合企业使用了 毕竟如果某金融企
  • UE4右键菜单(上篇ContentBrowser的补充)

    在上篇中我们讲到拓展我们的ContentBrowser的文件夹右键菜单 看回上篇代码可以发现其实真正起实现拓展 看到效果 的代码就只有一行 在代码中我们可以看到 MenuBuilder 这个东西是可以为我们创建一个菜单的 今天我们继续来改造