当我意识到我正在寻找的事件没有发生时,我试图找出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
拖放成功。我可以按预期移动节点。 Drop
或if object is self.view
事件发生了什么?
如果我删除支票{{1}}并且只是注意这两个事件,我仍然看不到它们。
答案 0 :(得分:1)
您需要跟踪视口上的事件,并过滤DragMove
和Drop
:
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)