UE-c++ 调用Windows文件管理器

本文介绍了在UE4游戏引擎中,通过C++实现用户自定义图片选择的功能。关键步骤包括添加必要的模块,打开文件对话框并获取选中文件路径。这一功能的实现使得程序能够接收用户提供的图像文件,增强了软件的交互性和实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 起因

学到图像处理的课程时,需要做个软件。
而对于处理的图像,我们希望用户可以提供自定义的图片,所以有这个需求。

二. 解决(注意,是UE框架下的C++)

!!!需要在项目.Build.cs添加 “DesktopPlatform”,“ApplicationCore” 两个模块

Build失败大部分是因为模块加载问题,不是你include头文件就行了,具体原因请了解UE的模块机制。

代码如下

#include "DesktopPlatformModule.h"
#include "Windows/WindowsWindow.h"
TArray<FString> UPhBlueprintFunctionLibrary::OpenImageFile()
{
	//选中文件路径
	TArray<FString> Path;
	//过滤文件类型
	const FString FileType = TEXT("图像文件 (*bmp;*.jpg;*.jpeg;*.png)|*bmp;*.jpg;*.jpeg;*.png");
	//文件选择窗口默认路径
	const FString DefaultPath = FPaths::ConvertRelativePathToFull(FPaths::ProjectDir());
	//获得支持的平台
	IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();
	//获得句柄
	const TSharedPtr<FGenericWindow> NativeWindow = GEngine->GameViewport->GetWindow()->GetNativeWindow();
	const auto Window = static_cast<FWindowsWindow*>(NativeWindow.Get());
	const auto Hwnd = Window->GetHWnd();
	//打开窗口
	DesktopPlatform->OpenFileDialog(Hwnd, TEXT("导入图片"), DefaultPath, TEXT(""), *FileType, EFileDialogFlags::Multiple, Path);
	return Path ;
}

UPhBlueprintFunctionLibrary 自定义的工具类。
FileType |前是显示给用户的文本,|后是需要的文件类型。
DesktopPlatform 不同平台。
NativeWindow 当前窗口。
EFileDialogFlags 控制单选/多选文件。
Path 此次窗口选择的所有文件的路径。

效果如图
在这里插入图片描述

三. 感想

调用文件夹 真是非常非常重要的一件事,不是因为实现它的难易程度,
而是它真的是 我写软件的灵魂所在,它意味着我的程序可以使用用户提供的文件,
不再是单个单个字符的输入,再默默的输出。
这在以前是不能想象的,它的出现,使得我就像井底之蛙看到了大海,萤火瞥见了皓月。
是那种,整日的迷茫,到一瞬间的豁然开朗。
自定义,实在是一件美妙的事情!!!
可惜同学不能怎么get到我的点…
emmm
下篇再说怎么使用得到的文件路径读取图片数据~~~

### 如何在UE5中通过C++调用Python脚本并获取返回值 在 Unreal Engine 中,可以通过 `FString` 和其他数据结构传递参数以及接收来自 Python 脚本的结果。以下是具体方法: #### 1. 设置环境 为了使 C++ 可以调用 Python 脚本,需先确认项目已启用 `UnrealEnginePython` 插件或其他支持 Python 的第三方插件[^2]。 #### 2. 编写 Python 脚本 假设有一个简单的 Python 函数用于计算两个数的和: ```python def add_numbers(a, b): return a + b ``` 此函数保存为文件名 `example_script.py` 并放置于项目的合适路径下(如 Content 文件夹中的子目录)。 #### 3. 在 C++ 中加载 Python 解释器 使用以下代码片段初始化 Python 环境,并执行指定的 Python 脚本: ```cpp #include "Internationalization/Regex.h" #include "Misc/AutomationTest.h" #include "Misc/FileHelper.h" #include "HAL/PlatformFileManager.h" void ExecutePythonScript(const FString& ScriptPath) { FScopedPythonGIL GIL; // 加载模块 PyObject* pModule = PyImport_ImportModule(ScriptPath); check(pModule != nullptr); // 获取函数对象 PyObject* pFunc = PyObject_GetAttrString(pModule, "add_numbers"); check(pFunc && PyCallable_Check(pFunc)); // 创建参数列表 PyObject* pArgs = PyTuple_New(2); PyTuple_SetItem(pArgs, 0, PyLong_FromLong(5)); // 参数a PyTuple_SetItem(pArgs, 1, PyLong_FromLong(7)); // 参数b // 执行函数并捕获返回值 PyObject* pValue = PyObject_CallObject(pFunc, pArgs); if (pValue != NULL) { int Result = PyLong_AsLong(pValue); // 将返回值转换为整型 UE_LOG(LogTemp, Warning, TEXT("Result from Python: %d"), Result); Py_DECREF(pValue); } } ``` 上述代码展示了如何加载名为 `add_numbers` 的 Python 函数,并传入两个整数值作为输入参数[^1]。 #### 4. 处理返回值 当 Python 函数成功运行后,其结果会存储在一个新的 `PyObject*` 对象中。该对象随后被解析成适合 C++ 使用的数据类型,在上面的例子中是一个整数类型的返回值。 #### 5. 清理资源 每次完成对 Python API 的调用之后,都应释放不再使用的内存区域以防泄漏。这包括减少引用计数的操作 (`Py_DECREF`) 或者显式销毁某些复杂对象实例。 --- ### 注意事项 尽管 Python 提供了强大的功能扩展能力,但在性能敏感的应用场合仍推荐优先考虑原生 C++ 实现方式。此外,由于跨语言交互可能带来额外开销,因此仅应在确实需要利用 Python 生态圈优势的情况下采用这种方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值