pyqt dropEvent不会触发

时间:2014-05-12 19:38:30

标签: python qt events drag-and-drop pyqt

我正在尝试将列表项拖到另一个列表中。 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。 mousMoveEvent正好被触发,因为mimeData()。text()在RemoteList的dragEnterEvent中打印出来就好了。我不认为它接受正确,因为dropEvent永远不会被触发,当我将鼠标悬停在RemoteList上时,它没有“drop here”图标。

1 个答案:

答案 0 :(得分:2)

您必须同时实施dragEnterEventdragMoveEvent。有关其他类似问题,请参阅here

这似乎做你需要的东西,而不是简短而优雅:)

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)