前言
文件拖放自动填充路径操作本应该是个很简单的操作,结果搜到的教程都在讲控件的拖拽,几经折磨后终于算是实现了这个功能吧。
操作
首先,要知道pyqt的控件有个setAcceptDrops(bool)方法可以设置控件是否接受拖放这个动作,如果是用qt设计师设计的界面可以看到该属性是默认打开的,既然默认打开,那么理论就应该可以实现文件拖放功能。
但实际操作时我却发现在IDE里可以拖放,但是到了实际的桌面却无法拖放,这一点我真是无法理解啊。。
因此我只好去看了一些拖拽的教程,发现在重写一个新的QLineEdit类的情况下是可以使用的,重写的类如下:class MyQLine(QLineEdit):
"""实现文件拖放功能"""
def __init__(self):
super().__init__()
self.setAcceptDrops(True) # 设置接受拖放动作
def dragEnterEvent(self, e):
if e.mimeData().text().endswith('.srt'): # 如果是.srt结尾的路径接受
e.accept()
else:
e.ignore()
def dropEvent(self, e): # 放下文件后的动作
path = e.mimeData().text().replace('file:///', '') # 删除多余开头
self.setText(path)
最关键的是e.mimeData().text()获取路径,这里的mimeData()可以参考官方说明
还有一个问题就是我是用qt设计师设计界面然后动态导入的,我自己新建了一个单行文本控件后,哪怕控件名字和之前的名字一样,最后生成的界面里还是会出现两个文本框,但我又不想在qt设计师里删除原来的文本框。所以我只好来个移花接木,把原来的文本框删掉并替换成我自己的。self.ui.file_path.deleteLater() # 删除原有的路径框
self.ui.file_path = MyQLine() # 新建自己的替换原有的
self.ui.file_path.setPlaceholderText('浏览或拖拽SRT字幕文件到这里')
self.ui.horizontalLayout_2.addWidget(self.ui.file_path)
self.ui.horizontalLayout_2.addWidget(self.ui.file)
针对上面的问题我后来找到了解决方案。