PySide2 QListWidget拖放事件信号无法接收求助
兄弟,你的问题核心是拖放事件的处理对象完全搞错了!你把dropEvent和写错名的dragEvent写在了对话框类ReOrder里,但实际上拖放事件是发送给QListWidget控件本身的,父窗口根本接不到这些事件。而且QListWidget在InternalMove模式下会默认处理拖放逻辑,若要自定义响应,必须子类化它并重写对应的事件方法。
问题拆解
- 你写的
dragEvent是错误的方法名,Qt中对应的拖动事件是dragEnterEvent、dragMoveEvent、dropEvent这类 - 拖放事件的接收者是
QListWidget,不是它的父窗口ReOrder,所以父类的事件方法永远不会被触发
修复后的完整代码
from PySide2 import QtCore from PySide2 import QtWidgets from PySide2 import QtGui from shiboken2 import wrapInstance # 自定义QListWidget子类,专门处理拖放事件 class MyListWidget(QtWidgets.QListWidget): def dragEnterEvent(self, event): # 只接收QListWidget支持的拖放数据格式 if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'): event.acceptProposedAction() print("Drag Enter Event Triggered") else: super().dragEnterEvent(event) def dragMoveEvent(self, event): event.acceptProposedAction() print("Drag Move Event Triggered") def dropEvent(self, event): # 先让QListWidget完成默认的内部重排逻辑 super().dropEvent(event) # 再执行你的自定义操作 print("Drop Event Triggered - 列表项已完成重新排列") def maya_main_window(): import maya.OpenMayaUI as omui ptr = omui.MQtUtil.mainWindow() return wrapInstance(int(ptr), QtWidgets.QWidget) if ptr else None class ReOrder(QtWidgets.QDialog): def __init__(self, parent=maya_main_window()): super(ReOrder, self).__init__(parent) self.setWindowTitle("ReOrder ") self.setFixedSize(300,405) self.CreateWidegts() self.Createlayouts() self.init_ui() self.setMouseTracking(True) def init_ui(self): self.myListWidget.setDragEnabled(True) self.myListWidget.setAcceptDrops(True) self.myListWidget.setDefaultDropAction(QtCore.Qt.MoveAction) self.myListWidget.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.myListWidget.setFont(QtGui.QFont('Berlin Sans FB Demi', 12)) # 修正addItem的用法:多个项要用addItems传列表 self.myListWidget.addItems(["Item1","Item2","Item3"]) def CreateWidegts(self): # 替换成自定义的MyListWidget self.myListWidget = MyListWidget() self.GoBtn = QtWidgets.QPushButton("ReOrder") def Createlayouts(self): mainLayout = QtWidgets.QVBoxLayout(self) mainLayout.addWidget(self.myListWidget) mainLayout.addWidget(self.GoBtn) def dosth(self): print("dosth")
关键修改说明
- 子类化QListWidget:创建
MyListWidget类,重写dragEnterEvent、dragMoveEvent、dropEvent——这些才是真正接收拖放事件的地方 - 保留默认逻辑:在
dropEvent里先调用super().dropEvent(event),让QListWidget完成内部重排,再执行你的自定义打印 - 修正API用法:原来的
addItem("Item1","Item2","Item3")是错误的,多个列表项需要用addItems()方法传入列表 - 数据格式校验:在
dragEnterEvent里校验mime类型,确保只接收QListWidget支持的拖放数据
这样修改后,拖动列表项时就能看到对应的事件打印,同时也保留了内部重排列的功能。
内容的提问来源于stack exchange,提问作者Hamid ThePhysicist
相关产品推荐
相关产品推荐

