通过拖动操作离开时未调用 Qt DragLeaveEvent

Qt DragLeaveEvent not being called when leaving with a drag operation

我有一排按钮,每个按钮都可以接受掉落。但是,当我用光标离开一个按钮并拖动另一个按钮时,不会调用 'dragLeaveEvent'。

class Button(QtGui.QPushButton):
    def __init__(self):
        super(Button, self).__init__()
        self.setAcceptDrops(True)

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            drag = QtGui.QDrag(self)
            mime = QtCore.QMimeData()
            mime.setText("f")
            drag.setMimeData(mime)
            drag.exec_()

    def dragEnterEvent(self, event):
        print "enter"

    def dragLeaveEvent(self, event):
        print "leave"


class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.mainLayout = QtGui.QVBoxLayout()
        self.setLayout(self.mainLayout)
        for i in range(10):
            btn = Button()
            self.mainLayout.addWidget(btn)


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

关于 dragEnterEvent() 报告的文档(来自 Qt5,但同样适用于 Qt4):

If the event is ignored, the widget won't receive any drag move events.

注意:任何拖动移动事件
这也意味着 drop 事件。

默认情况下,大多数小部件都会忽略所有拖动事件如果不接受拖动输入事件,所以如果您想接收 第一个事件 必须 被接受的所有事件(包括 离开 事件)。

class Button(QtGui.QPushButton):
    # ...
    def dragEnterEvent(self, event):
        <b>event.accept()</b>
        print "enter"