gpt4 book ai didi

python - 为什么 QTreeView 在拖放过程中不触发 Drop 或 Move 事件?

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:47 27 4
gpt4 key购买 nike

我试图找出 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

The view accepts move (not copy) operations only from itself. - Documentation

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

  • QtCore.QEvent.ChildAdded
  • QtCore.QEvent.ChildRemoved
  • QtCore.QEvent.Timer
  • QtCore.QEvent.ToolTip

拖放成功。我可以按预期移动节点。 MoveDrop 事件发生了什么?

如果我删除检查if object is self.view并只观察这两个事件,我仍然没有看到它们发生。

最佳答案

您需要跟踪视口(viewport)上的事件,并过滤 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)

关于python - 为什么 QTreeView 在拖放过程中不触发 Drop 或 Move 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28994494/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com