文章目录
- 实现文件的拖放功能
- 1 拖放文件至QT窗口
- 1.1 实现方法
- 1.2 效果演示
- 2 拖放文件至python脚本
- 2.1 实现方法
- 2.2 效果演示
实现文件的拖放功能
试想一下,我们希望将一个python项目文件夹或者脚本在IDE中打开,无论是去IDE中选择文件夹路径,还是选择脚本的打开方式,都需要花点力气去点击选中。再或者,我们想要在命令行下运行python脚本,并且需要传入一个文件路径参数,手敲路径还是挺麻烦的。要是上述这些情况能用拖放文件的方式代替,毋庸置疑是方便且轻松的。
PS:下面介绍的方法只在Windows下测试成功。
1 拖放文件至QT窗口
为了给QT窗口添加拖放文件至窗体内并执行操作的功能,这里举一个例子。我们写了一个简单的三维模型文件可视化软件,即使软件中有“打开文件”的选项,但是在有些情况下还是很麻烦。我们希望能够将模型文件直接拖进软件的窗口内进行可视化绘制。
1.1 实现方法
参考这篇文章:Qt主窗口实现拖拽文件,显示到文本框
在窗口初始化函数中添加一行
self.setAcceptDrops(True) # 设置接受拖拽
然后重写dragEnterEvent
和dropEvent
两个方法
def dragEnterEvent(self, a0: QtGui.QDragEnterEvent) -> None: # 拖动进入事件
if a0.mimeData().hasUrls():
a0.acceptProposedAction()
else:
a0.ignore()
def dropEvent(self, a0: QtGui.QDropEvent) -> None: # 放下事件
mimeData = a0.mimeData()
if mimeData.hasUrls():
urlList = mimeData.urls()
filename = urlList[0].toLocalFile() # 得到了文件的路径
if filename: # 下面便是对文件的相关操作
# 绘制图形
_, suffix = os.path.splitext(filename)
self.SceneManager.ClearAll()
if suffix == '*.xyz': # 点云绘制
self.original_model = read_xyz(filename)
self.SceneManager.drawPdSrc(self.original_model, (241 / 255, 135 / 255, 184 / 255), point_size = 3)
else:
self.original_model = ReadPolyData(filename).GetOutput()
self.SceneManager.drawPdSrc(self.original_model)
self.SceneManager.display()
1.2 效果演示
2 拖放文件至python脚本
已知在windows系统中,python脚本文件为.py文件,该文件是不支持拖放其他文件到其上的。我们希望实现将其他文件拖放到脚本文件上,作为其输入参数,并运行脚本。
2.1 实现方法
新建一个pyfile_droppable.reg
文件,输入以下内容并保存:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Python.File\shellex\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"
[HKEY_CLASSES_ROOT\Python.File\Shell\open\command]
@=""<python interpreter path>" "%L" %*"
双击运行此文件,完成注册表相关信息的添加。相关原理参考:Make Python Scripts Droppable in Windows。
上面这个reg文件添加了两个项到注册表中,第3、4行的作用是使python脚本文件能接收拖放到它上面的文件(获取文件的路径),第6、7行的作用是指定运行python脚本的解释器路径。通过打开注册表查看发现,我们主要修改了下图中的两个地方。
接着,我们新建一个测试脚本droppable_test.py
,内容如下
import os
import sys
py_dir = os.path.dirname(__file__) # 当前脚本所在的目录
result_path = os.path.join(py_dir, 'result.txt') # 生成的结果文件放在脚本目录下
args = sys.argv
# 合并内容并生成新文件
with open(args[1], 'rb') as f:
data1 = f.read()
with open(args[2], 'rb') as f:
data2 = f.read()
with open(result_path, 'wb') as f:
f.write(data1 + data2)
print("文件合并成功!结果文件保存至:" + result_path)
input("按任意键关闭窗口...")
2.2 效果演示
注意多个文件作为参数传入py脚本的顺序为选中多个文件的顺序,即从上到下,从左到右。