pyqt dropEvent 不触发

1 投票
1 回答
3172 浏览
提问于 2025-04-18 06:20

我正在尝试把一个列表项拖到另一个列表上。拖动进入事件(dragEnterEvent)可以正常触发,我也调用了 e.accept(),但是放下事件(dropEvent)却从来没有触发。以下是我的代码:

class LocalList(QtGui.QListWidget):
    def __init__(self, parent):
        super(LocalList, self).__init__(parent)
        self.parent = parent
        self.setDragEnabled(True)

    def mouseMoveEvent(self, e):
        mimeData = QtCore.QMimeData()
        mimeData.setText(self.currentItem().text())
        drag = QtGui.QDrag(self)
        drag.setMimeData(mimeData)
        dropAction = drag.exec_()

class RemoteList(QtGui.QListWidget):
    def __init__(self, parent):
        super(RemoteList, self).__init__(parent)
        self.parent = parent
        self.setAcceptDrops(True)

    def dragEnterEvent(self, e):
        print "MimeText: " + e.mimeData().text()
        e.accept()

    def dropEvent(self, e):
        print "DROPPED"
        print self.parent.localdir + "/" + e.mimeData().text()
        e.accept()

为了更清楚,我是从本地列表(LocalList)拖到远程列表(RemoteList)。鼠标移动事件(mouseMoveEvent)也能正常触发,因为在远程列表的拖动进入事件中,mimeData().text() 打印的内容也没问题。不过我觉得它没有正确接受这个操作,因为放下事件从来没有触发,而且当我把鼠标悬停在远程列表上时,它没有显示“在这里放下”的图标。

1 个回答

2

你需要实现两个功能:dragEnterEventdragMoveEvent。想了解更多类似的问题,可以查看 这里

这个方法看起来既简单又优雅,能够满足你的需求 :)

class DragDropListWidget(QtGui.QListWidget):
    def __init__(self, type, parent=None):
        super(DragDropListWidget, self).__init__(parent)
        self.setDefaultDropAction(QtCore.Qt.MoveAction)
        self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
        self.setAcceptDrops(True)

撰写回答