如何覆盖 Qt Designer 生成的 PySide2 小部件的方法?
How to override PySide2 widget's method generated by Qt Designer?
我正在尝试通过在 powertoys 中创建类似 powerrename 工具的模拟可执行文件来学习 PySide2。
成功加载 Ui_PowerRenameDialog 后,它是由 Qt Designer 创建的 .ui 文件生成的。
我遇到一个错误试图完成一项功能,该功能可以让用户将文件从 Windows Explorer 拖放到 .[=70= 中嵌入的 QTreeWidget ] 文件。
这是我的完整代码:
import sys
from PySide6 import QtWidgets
from PySide6 import QtCore
from ui_powerRename import Ui_PowerRenameDialog
class MyPowerRenameDialog(QtWidgets.QDialog):
def __init__(self,parent=None):
super().__init__(parent)
self.ui = Ui_PowerRenameDialog()
self.ui.setupUi(self)
self.modify_ui()
self.create_connections()
def modify_ui(self):
self.ui.previewTreeWidget.setAcceptDrops(True)
def dragEnterEvent(self,evt):
if evt.mimeData().hasUrls():
evt.accept()
else:
evt.ignore()
def dropEvent(self,evt):
for url in evt.mimeData().urls():
newItem = QtWidgets.QTreeWidgetItem(url)
self.addTopLevelItem(newItem)
self.ui.previewTreeWidget.dragEnterEvent = dragEnterEvent
self.ui.previewTreeWidget.dropEvent = dropEvent
items = QtWidgets.QTreeWidgetItemIterator(self.ui.previewTreeWidget)
for item in items:
item.value().setFlags(item.value().flags()|QtCore.Qt.ItemIsUserCheckable)
item.value().setCheckState(0,QtCore.Qt.Checked)
def create_connections(self):
self.ui.cancelButton.clicked.connect(self.close)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MyPowerRenameDialog()
window.show()
sys.exit(app.exec_())
=========================================== ===================
这是我目前取得的成果(红色区域是 QTreeWidget):
可执行快照:
如您所见,我试图重载 QTreeWidget 对象的 dragEnterEvent 和 dropEvent 方法。
覆盖代码中最重要的部分如下所示:
def dragEnterEvent(self,evt):
if evt.mimeData().hasUrls():
evt.accept()
else:
evt.ignore()
def dropEvent(self,evt):
for url in evt.mimeData().urls():
newItem = QtWidgets.QTreeWidgetItem(url)
self.addTopLevelItem(newItem)
self.ui.previewTreeWidget.dragEnterEvent = dragEnterEvent
self.ui.previewTreeWidget.dropEvent = dropEvent
=========================================== ==================
问题是当试图将任何内容从资源管理器拖放到 QTreeWidget 实例时,我得到一个 TypeError
TypeError: dragEnterEvent() missing 1 required positional argument: 'evt'.
我试图搜索类似的 questions.One 可能的解决方案是使用 installEventFilter。但这只会让我出错。
我的意思是 PySide2 文档真的很乱,我无法从他们格式糟糕的文档中获取任何有用的信息。
doc.And中的例子很少,大部分都是直接从C++版本复制过来的,连Python语法都没有改。
知道如何实现该功能吗?
有什么建议的学习 PySide2 的方法吗?
错误来自于 dragEnterEvent
和 dropEvent
没有绑定到 class (因为它们嵌套在另一个函数中),这意味着 self
不是自动的,这就是为什么当它被调用时需要两个参数,self
和 evt
,但 Qt 框架只传递 evt
.
要修改 Ui_PowerRenameDialog
的行为,您应该创建 Ui_PowerRenameDialog
的子class 并在该子class
中实现两个事件方法
我正在尝试通过在 powertoys 中创建类似 powerrename 工具的模拟可执行文件来学习 PySide2。
成功加载 Ui_PowerRenameDialog 后,它是由 Qt Designer 创建的 .ui 文件生成的。
我遇到一个错误试图完成一项功能,该功能可以让用户将文件从 Windows Explorer 拖放到 .[=70= 中嵌入的 QTreeWidget ] 文件。
这是我的完整代码:
import sys
from PySide6 import QtWidgets
from PySide6 import QtCore
from ui_powerRename import Ui_PowerRenameDialog
class MyPowerRenameDialog(QtWidgets.QDialog):
def __init__(self,parent=None):
super().__init__(parent)
self.ui = Ui_PowerRenameDialog()
self.ui.setupUi(self)
self.modify_ui()
self.create_connections()
def modify_ui(self):
self.ui.previewTreeWidget.setAcceptDrops(True)
def dragEnterEvent(self,evt):
if evt.mimeData().hasUrls():
evt.accept()
else:
evt.ignore()
def dropEvent(self,evt):
for url in evt.mimeData().urls():
newItem = QtWidgets.QTreeWidgetItem(url)
self.addTopLevelItem(newItem)
self.ui.previewTreeWidget.dragEnterEvent = dragEnterEvent
self.ui.previewTreeWidget.dropEvent = dropEvent
items = QtWidgets.QTreeWidgetItemIterator(self.ui.previewTreeWidget)
for item in items:
item.value().setFlags(item.value().flags()|QtCore.Qt.ItemIsUserCheckable)
item.value().setCheckState(0,QtCore.Qt.Checked)
def create_connections(self):
self.ui.cancelButton.clicked.connect(self.close)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MyPowerRenameDialog()
window.show()
sys.exit(app.exec_())
=========================================== ===================
这是我目前取得的成果(红色区域是 QTreeWidget):
可执行快照:
如您所见,我试图重载 QTreeWidget 对象的 dragEnterEvent 和 dropEvent 方法。 覆盖代码中最重要的部分如下所示:
def dragEnterEvent(self,evt):
if evt.mimeData().hasUrls():
evt.accept()
else:
evt.ignore()
def dropEvent(self,evt):
for url in evt.mimeData().urls():
newItem = QtWidgets.QTreeWidgetItem(url)
self.addTopLevelItem(newItem)
self.ui.previewTreeWidget.dragEnterEvent = dragEnterEvent
self.ui.previewTreeWidget.dropEvent = dropEvent
=========================================== ==================
问题是当试图将任何内容从资源管理器拖放到 QTreeWidget 实例时,我得到一个 TypeError
TypeError: dragEnterEvent() missing 1 required positional argument: 'evt'.
我试图搜索类似的 questions.One 可能的解决方案是使用 installEventFilter。但这只会让我出错。
我的意思是 PySide2 文档真的很乱,我无法从他们格式糟糕的文档中获取任何有用的信息。
doc.And中的例子很少,大部分都是直接从C++版本复制过来的,连Python语法都没有改。
知道如何实现该功能吗?
有什么建议的学习 PySide2 的方法吗?
错误来自于 dragEnterEvent
和 dropEvent
没有绑定到 class (因为它们嵌套在另一个函数中),这意味着 self
不是自动的,这就是为什么当它被调用时需要两个参数,self
和 evt
,但 Qt 框架只传递 evt
.
要修改 Ui_PowerRenameDialog
的行为,您应该创建 Ui_PowerRenameDialog
的子class 并在该子class