如何获取在PyQt Drag Drop中删除的QTreeWidgetItem的句柄?

时间:2011-01-24 19:55:22

标签: python qt pyqt

我试图通过覆盖dropEvent方法来处理TreeWidget上的drop事件。最终,我需要获取被删除的TreeWidgetItem的句柄。到目前为止,我从事件中获得的关于被删除项目的唯一有用信息是QByteArray,它似乎包含被删除项目的文本,除了它的格式很差,有很多空格和一堆不可打印的字符。

非常感谢任何帮助。

编辑:

这是代码,如所提出的,但我真的没有做任何特别的事情,我实际上只是读取drop事件的mimeData中包含的唯一数据类型。听起来好像我将不得不重写Drag事件?并添加一些类型的标识符,以允许我获得一个回到原始QTreeWidget的句柄??

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

1 个答案:

答案 0 :(得分:1)

我不太确定我是否正确理解了这个问题,但你的mime数据来自startDrag方法,你创建了一个QMimeData对象,设置了它的类型并相应地提供了数据。在您的dropEvent方法中,检查传入数据的类型并相应地处理它,或者如果您不识别该类型则忽略。

另请查看此处的文档:Drag and Drop它应该让您了解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 with drag and drop support in PyQt

希望这有帮助,尊重