多一种操作方式,多一种可能
SDropTarget用于实现各种拖放操作,例如将文件拖放到其中以读取文件,或将Actor等拖放到工具中以获取实例。
拖拽操作方面用户以更加直观的方式与工具进行交互,会有更好的体验。
例如,在Object Detail View中,我们可以直接将需要查看的对象拖拽到窗口。
Shelf工具我们可以将文本,Actor,Chameleon Tool工具等拖拽到窗口。
这个视频中,我们可以将图片拖拽到编辑窗口,获取其路径和内容之后再进行后续操作
OnDrop¶
例如,下面的代码中,我们将一个SMultiLineEditableTextBox放在SDropTarget中,当拖放文件或文本到SDropTarget中时,将会触发on_drop_func函数。从而获得用户拖放的文件或文本。
"SDropTarget": {
"Text": "SDropTarget",
"HAlign": "Center",
"OnDrop": "chameleon_instance.on_drop_func(%**kwargs)",
"Content":
{
"SMultiLineEditableTextBox":
{
"Aka": "file_path_input",
"Text": "Drag and Drop, File or Text"
}
}
}
支持的类型¶
- Assets. Unreal 中的UAssets
- Folder. Content Browser中的文件夹
- Actors. Actor实例
- External file. For instance, drag and drop a file from windows explorer.
- External text. Select some text in Text Editor(Pycharm, sublime, notepad++), and drag and drop it.
变量占位符¶
%**kwargs¶
在上面的JSON文件中,"chameleon_instance.on_drop_func(%**kwargs)"
。 我们使用了%**kwargs
这个变量占位符。在运行时,它会被实际的值替换。
例如:
当我们拖拽一个文件到SDropTarget中时,
%kwargs会被替换为:
files = [file_path_a, file_path_b_if_exists, ...],
当拖拽一段文本时,
%kwargs会被替换为:
text = text_conent`
这样,我们就可以在on_drop_func
中,可以通过**kwargs
捕获所有的参数及其对应的值。
具体现在用到的参数名有:
- "assets"
- "assets_folders"
- "folders"
- "text"
- "files"
分别对应上面支持的5种对象类型
TIP
可以在通过kwargs.keys()
获取当前可用的参数名
def on_drop_func(self, *args, **kwargs):
file_names = kwargs.get("files", None)
text = kwargs.get("text", "")
if file_names:
file_path = file_names[0]
print(f"file_path: {file_path}")
if os.path.exists(file_path):
self.data.set_text(self.ui_file_path_input, file_path)
else:
if text:
print(f"text: {text}")
self.data.set_text(self.ui_input, text)
其他¶
下面三个是遗留的变量占位符,由于功能与%**kwargs
重复,所以不再推荐继续使用。
- %assets_folders
- %folders
- "%actors
小结¶
SDropTarget是一个非常有用的控件,可以让用户以更加直观的方式与工具进行交互,会有更好的体验。通过%**kwargs
,我们可以获取到用户拖放的对象,从而在Python中进行后续操作。