前言
我之前需要对一个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
20 条评论
"提升的类名的路径是基于我们ui文件而言的,所以我这里ui文件必须和MyWidget.py在同一目录下"——
实测不是这样,只要把路径写清楚就好了。
发现打包成EXE就可以导入电脑里其他的文件了,谢谢你,这篇文章对我的帮助很大|´・ω・)ノ
博主有找到只能在IDE拖拽的原因了么、我下载了你的文件,在我电脑上还是只能在IDE拖拽,电脑里的其他文件拖过去就是个禁止符号(ó﹏ò。)
继承控件类自己写拖拽和拖放代码就可以脱离IDE了,我的代码只接受srt文件,你得去理解我的代码
from PySide6.QtWidgets import *
class QLineEditEX(QLineEdit):
用博主的代码并不能生效
后来又百度翻到其他代码 搞定了
牛逼!
运行代码没报错,为啥还不行啊?还是不能识别拖拽。(╯‵□′)╯︵┴─┴
我这段代码是项目 https://github.com/kizx/subtitle2audio 里直接拷贝出来的,只能拖入srt文件,这里主要讲个思路|´・ω・)ノ
请问楼主,我提升之后运行程序找不到我的头文件这个模块怎么回事?
头文件名称或路径引用不对,建议先把ui文件转成py文件进行运行,这样报错就知道错在哪了。
谢谢 一个很奇怪的点就是PySide运行不报错,PyQt报错
pyqt不需要最后那步注册,pyside需要加一步注册,具体你可以看看我参考的文章
按照步骤操作显示NameError: name 'MyQLine' is not defined那里出错了:
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
class Stats:
if name == '__main__':
你可以先使用静态的方法,将ui转为py文件使用,这样报错就能定位分析了。
感谢大神,我已经解决问题了,谢谢你的分享。
解决了.
兄台、你实现了吗?我折腾2个小时、没搞定、能发我下你测试通过的代码吗?
感谢!解决了我这个初学者遇到的问题
加油加油
一起加油OωO