为什么QTreeView在拖放期间不会触发Drop或Move事件?

时间:2015-03-11 18:24:05

标签: python pyqt qtreeview

当我意识到我正在寻找的事件没有发生时,我试图找出this问题的答案。

import sys, new
from PyQt4 import QtGui, QtCore 

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.model = QtGui.QStandardItemModel()

        for k in range(0, 4):
            rootItem = self.model.invisibleRootItem()
            parentItem = QtGui.QStandardItem(QtCore.QString("Parent: %0").arg(k))
            for i in range(0, 5):
                item = QtGui.QStandardItem(QtCore.QString("Value: %0").arg(i))
                parentItem.appendRow(item)
            rootItem.appendRow(parentItem)

        self.view = QtGui.QTreeView()
        self.view.setModel(self.model)
        self.view.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
        self.view.expandAll()
        self.view.installEventFilter(self)
        self.setCentralWidget(self.view)


    def eventFilter(self, object, event):
        if object is self.view:
            if event.type() == QtCore.QEvent.Move:
                print "Moved!"
                event.accept()
                return True
            else:
                event.ignore()
                return super(MainForm, self).eventFilter(object, event)

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

我解决这个问题的想法是利用事件过滤器并观察QtCore.QEvent.Move事件。这是因为DragDrop模式设置为QtGui.QAbstractItemView.InternalMove

  

视图仅接受来自自身的移动(非复制)操作。 - Documentation

问题是,这个事件永远不会被解雇。 QtCore.QEvent.Drop也不是。QtCore.QEvent.ChildAdded。相反,我看到以下events

  • QtCore.QEvent.ChildRemoved
  • QtCore.QEvent.Timer
  • QtCore.QEvent.ToolTip
  • Move

拖放成功。我可以按预期移动节点。 Dropif object is self.view事件发生了什么?

如果我删除支票{{1}}并且只是注意这两个事件,我仍然看不到它们。

1 个答案:

答案 0 :(得分:1)

您需要跟踪视口上的事件,并过滤DragMoveDrop

    self.view.viewport().installEventFilter(self)

def eventFilter(self, object, event):
    if object is self.view.viewport():
        if event.type() == QtCore.QEvent.DragMove:
            print "Moved!"
        elif event.type() == QtCore.QEvent.Drop:
            print "Dropped!"
    return super(MainForm, self).eventFilter(object, event)