前言


我之前需要对一个QLineEdit控件实现文件拖拽的功能,在折腾一番后发现只有继承QLineEdit类重写方法才能实现我的功能,但我是用动态加载ui文件的方法,所以没办法直接加载我写的自定义控件,当时是用把原控件删除了再把自己的控件加进去的野蛮方法,但后来我看了黑羽的新教程才知道Qt设计师里右键有个提升控件功能就是专门解决这个问题的。

class MainWindow(QObject):

    def __init__(self):
        super().__init__()
        self.ui = QUiLoader().load('static/mainwindow.ui')

        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)
...

方法

先新建一个MyWidget.py文件用于写自定义控件。

from PySide2.QtWidgets import QLineEdit


class MyQLine(QLineEdit):
    """实现文件拖放功能"""

    def __init__(self, parent=None):
        super().__init__(parent)
        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)

先在Qt设计师里右键提升控件,提升控件的基类一般就是控件自身本来的类,提升的类名称就是自定义的类名称,头文件是指自定义的类所在的库的名称。如果搞不清这里,可以将ui文件转为py文件,然后查看import部分就明白了。

这里就要注意了,这个提升的类名的路径是基于我们ui文件而言的,所以我这里ui文件必须和MyWidget.py在同一目录下,而且必须保证这里不能有报错,比如我之前在自定义MyQLine时没有传入parent参数就会报错。


然后就是在主程序里加载界面就行了,如果用的是Pyside2还需要加一步注册

class MainWindow(QObject):

    def __init__(self):
        super().__init__()
        loader = QUiLoader()
        loader.registerCustomWidget(MyQLine) # 注册
        self.ui = loader.load('mainwindow.ui')
···

参考

http://www.python3.vip/tut/py/gui/pyqtgraph-2/
https://blog.csdn.net/qq937772489/article/details/81332037

最后修改:2021 年 01 月 24 日
你的赞赏是我前进的动力