如何在PyQt拖放中获取被放置的TreeWidgetItem的句柄?

0 投票
1 回答
3362 浏览
提问于 2025-04-16 10:32

我正在尝试处理一个树形控件(TreeWidget)的拖放事件,方法是重写它的 dropEvent 方法。最终,我需要获取被拖放的树形控件项(TreeWidgetItem)。到目前为止,我从事件中得到的关于被拖放项的唯一有用信息是一个 QByteArray,看起来里面包含了被拖放项的文本,但格式很糟糕,里面有很多空格和一些不可打印的字符。

如果能得到一些帮助,我将非常感激。

补充:

这是代码,按照要求提供的,但我其实并没有做什么特别的事情,我只是读取了拖放事件中 mimeData 里唯一的数据类型。听起来我可能需要重写拖动事件?并添加某种标识符,以便让我能找到原来的 QTreeWidget?

def dropEvent( self, event ):
    data = event.mimeData().data( 'application/x-qabstractitemmodeldatalist' )
    print data

1 个回答

2

我不太确定我是否理解你的问题,但你的 MIME 数据是从 startDrag 方法来的。在这个方法里,你创建了一个 QMimeData 对象,设置了它的类型,并相应地提供了数据。在你的 dropEvent 方法中,检查一下传入数据的类型,然后根据类型进行处理,如果不认识这个类型就可以忽略它。

另外,你可以看看这里的文档:拖放操作,这应该能让你了解在 Qt 中拖放是怎么工作的。

我这里也做了一个小例子,看看是否对你有帮助:

import sys
from PyQt4 import QtGui, QtCore

class TestTreeWidget(QtGui.QTreeWidget):
    def __init__(self, parent = None):
        super(TestTreeWidget, self).__init__(parent)
        self.setDragEnabled(True)
        self.setAcceptDrops(True)

    def startDrag(self, dropAction):
        # create mime data object
        mime = QtCore.QMimeData()
        mime.setData('application/x-item', '???')
        # start drag 
        drag = QtGui.QDrag(self)
        drag.setMimeData(mime)        
        drag.start(QtCore.Qt.CopyAction | QtCore.Qt.CopyAction)

    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat("application/x-item"):
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dragEnterEvent(self, event):
        if (event.mimeData().hasFormat('application/x-item')):
            event.accept()
        else:
            event.ignore()    

    def dropEvent(self, event): 
        if (event.mimeData().hasFormat('application/x-item')):
            event.acceptProposedAction()
            data = QtCore.QString(event.mimeData().data("application/x-item"))
            item = QtGui.QTreeWidgetItem(self)
            item.setText(0, data)
            self.addTopLevelItem(item)
        else:
            event.ignore()    

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

        self.view = TestTreeWidget(self)
        self.view.setColumnCount(1)
        item0 = QtGui.QTreeWidgetItem(self.view)
        item0.setText(0, 'item0')
        item1 = QtGui.QTreeWidgetItem(self.view)
        item1.setText(0, 'item1')
        self.view.addTopLevelItems([item0, item1])

        self.setCentralWidget(self.view)

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

if __name__ == '__main__':
    main()

你可能还想看看这里的类似帖子:支持拖放的 QTreeView 在 PyQt 中的实现

希望这对你有帮助,祝好!

撰写回答