获取拖放qtreewidget项目 - Python

时间:2015-12-02 23:24:44

标签: python pyside qtreewidget qtreewidgetitem

有没有办法可以拖动/删除项目及其目标父项?

在理想情况下,我想要发生的是,当 dropEvent 完成后,它会打印移动的qtreewidgetitems,以及项目移动到的新父级。父母可以是qtreewidget本身,也可以是另一个qtreewidgetitem,具体取决于丢弃的位置。

有人可以帮助我吗?

以下是我目前的代码。

enter image description here

# Imports
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore, QtSvg

class TreeNodeItem( QtGui.QTreeWidgetItem ):
    def __init__( self, parent, name="" ):
        super( TreeNodeItem, self ).__init__( parent )
        self.setText( 0, name )
        self.stuff = "Custom Names - " + str(name)

class TreeWidget(QtGui.QTreeWidget):
    def __init__(self, parent=None):
        QtGui.QTreeWidget.__init__(self, parent)
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.setItemsExpandable(True)
        self.setAnimated(True)
        self.setDragEnabled(True)
        self.setDropIndicatorShown(True)
        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
        self.setAlternatingRowColors(True)

    # def dropEvent(self, event):
    #     print "finished"
    def dropEvent(self, event):
        return_val = super( TreeWidget, self ).dropEvent( event )
        print ("Drop finished")
        d = event.mimeData()
        print d, event.source()
        return return_val

# Main
# ------------------------------------------------------------------------------
class ExampleWidget(QtGui.QWidget):

    def __init__(self,):
        super(ExampleWidget, self).__init__()

        self.initUI()

    def initUI(self):

        # formatting
        self.resize(250, 400)
        self.setWindowTitle("Example")

        # widget - passes treewidget
        self.itemList = QtGui.QTreeWidget()
        self.itemList = TreeWidget()

        headers = [ "Items" ]
        self.itemList.setColumnCount( len(headers) )
        self.itemList.setHeaderLabels( headers )            

        # layout Grid - row/column/verticalpan/horizontalspan
        self.mainLayout = QtGui.QGridLayout(self)
        self.mainLayout.setContentsMargins(5,5,5,5)
        self.mainLayout.addWidget(self.itemList, 0,0,1,1)

        # display
        self.show()

    # Functions
    # --------------------------------------------------------------------------   
    def closeEvent(self, event):
        print "closed"


    def showEvent(self, event):
        print "open"
        for i in xrange(20):
            TreeNodeItem( parent=self.itemList , name=str(i) )

# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    ex = ExampleWidget()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:1)

我建议使用View / Model方法。 解码' application / x-qabstractitemmodeldatalist'只会返回拖动的项目,并且不会在QTreeWidget中使用dropMimeData。

在这里查看示例。 https://wiki.python.org/moin/PyQt/Handling%20Qt's%20internal%20item%20MIME%20type