如何获取发生拖放的项目

0 投票
1 回答
639 浏览
提问于 2025-04-18 17:04

下面的代码创建了一个 QTreeWidget,里面有五个项目。

这里插入图片描述

我想知道在内部拖放操作后,如何获取到被拖放到的项目(或者它的索引)。比如说,如果我选择了Item_4,然后把它拖到Item_2上。那么我想要得到的是“Item_2”,也就是接收了被拖放项目的那个项目。

0. startDrag(): <PyQt4.QtCore.DropActions object at 0x10f5d1230>
1. dragEnterEvent(): <PyQt4.QtGui.QDragEnterEvent object at 0x10f5cb6d8> 
2. dropEvent(): <PyQt4.QtGui.QDropEvent object at 0x10f5cb6d8> 
3. startDrag(): <PyQt4.QtCore.DropActions object at 0x10f5d1230>

========

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

class Tree(QtGui.QTreeWidget):
    def __init__(self, *args, **kwargs):
        super(Tree, self).__init__()
        self.setDragDropMode(self.DragDrop)
        for each in ['Item_1','Item_2','Item_3','Item_4','Item_5']:
            item=QtGui.QTreeWidgetItem([each])
            self.addTopLevelItem(item)
        self.setColumnCount(1)
        self.resize(360,240)
        self.show()
    def startDrag(self, actions):
        print '0. startDrag(): %s'%actions        
        super(Tree, self).startDrag(actions)
        print '3. startDrag(): %s \n'%actions
    def dragEnterEvent(self, event):        
        super(Tree, self).dragEnterEvent(event)
        print '1. dragEnterEvent(): %s'%event
    def dropEvent(self, event):
        super(Tree, self).dropEvent(event)
        print '2. dropEvent(): %s'%event
tree=Tree()
sys.exit(app.exec_())

1 个回答

1

你可以在 QDropEvent 类中使用 QPoint pos (self),然后结合 QTreeWidgetItem QTreeWidget.itemAt (self, QPoint p) 来获取目标位置上的 QTreeWidgetItem

.
.
def dragMoveEvent (self, eventQDragMoveEvent):
    QtGui.QTreeWidget.dragMoveEvent(self, eventQDragMoveEvent)
    sourceQCustomTreeWidget = eventQDragMoveEvent.source()
    if isinstance(sourceQCustomTreeWidget, QtGui.QTreeWidget):
        print '#############'
        sourceQTreeWidgetItem = sourceQCustomTreeWidget.currentItem()
        if sourceQTreeWidgetItem != None:
            print 'Source :', sourceQTreeWidgetItem.text(0)
        else:
            print 'Source : None'
        destinationQTreeWidgetItem = self.itemAt(eventQDragMoveEvent.pos())
        if destinationQTreeWidgetItem != None:
            print 'Destination :', destinationQTreeWidgetItem.text(0)
        else:
            print 'Destination : None'
.
.

QTreeWidgetItem QTreeWidget.itemAt (self, QPoint p) 参考链接 :

http://pyqt.sourceforge.net/Docs/PyQt4/qtreewidget.html#itemAt

QPoint QDropEvent.pos (self) 参考链接 :

http://pyqt.sourceforge.net/Docs/PyQt4/qdropevent.html#pos


祝好,

撰写回答