You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. 子类化QListWidget:创建MyListWidget类,重写dragEnterEvent、dragMoveEvent、dropEvent——这些才是真正接收拖放事件的地方
  2. 保留默认逻辑:在dropEvent里先调用super().dropEvent(event),让QListWidget完成内部重排,再执行你的自定义打印
  3. 修正API用法:原来的addItem("Item1","Item2","Item3")是错误的,多个列表项需要用addItems()方法传入列表
  4. 数据格式校验:在dragEnterEvent里校验mime类型,确保只接收QListWidget支持的拖放数据

这样修改后,拖动列表项时就能看到对应的事件打印,同时也保留了内部重排列的功能。

内容的提问来源于stack exchange,提问作者Hamid ThePhysicist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:52:54