[post cid=“159” /] 我之前需要对一个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