前言

文件拖放自动填充路径操作本应该是个很简单的操作,结果搜到的教程都在讲控件的拖拽,几经折磨后终于算是实现了这个功能吧。

操作

首先,要知道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()可以参考官方说明 https://doc.qt.io/qtforpython/PySide2/QtCore/QMimeData.html
在上面的动图里能看到拖放文件后获得的文件路径是以'file:///'开头的,所以需要去掉这玩意,剩下的应该很简单了。


还有一个问题就是我是用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)
Last modification:April 8th, 2020 at 11:42 am