在QAbstractItemModel PySide PyQt中拖放

时间:2014-04-01 17:50:20

标签: python qt pyqt pyside

我一直在学习如何使用QTreeView和一个自定义Item类来实现QAbstractItemModel,除了拖放之外我一切都在工作。

最终我希望能够使用shift键在移动和复制项目之间切换,但是现在我只是想让InternalMove完全正常工作....

我正在重新实现mimeData和dropMimeData,就像这样....

class BuildModel( QAbstractItemModel ):
    def __init__( self, root):
        super( BuildModel, self ).__init__()

    def mimeTypes( self ):
        return ['sushi-build-items']

    def mimeData( self, indices ):
        mimedata = QMimeData()
        mimedata.setData('sushi-build-items', self.getSerializedData(indices) )
        return mimedata

    def dropMimeData( self, mimedata, action, row, column, parentIndex ):
        if not mimedata.hasFormat( 'sushi-build-items' ):
            return False
        data = pickle.loads((str(mimedata.data('sushi-build-items'))))
        items = dataToItems(data)
        self.insertItems(row, items, parentIndex)
        return True

    def insertItems( self, row, items, parentIndex):
        parent = self.itemFromIndex(parentIndex)
        self.beginInsertRows( parentIndex, row, row+len(items)-1 )
        if row == -1:
            parent.addChildren(items)
        else:
            parent.insertChildren(row, items)
        self.endInsertRows()
        self.dataChanged.emit(parentIndex, parentIndex)
        return True

我的树视图就像这样设置为InternalMove ....

class TreeView(QTreeView):
    def __init__(self, parent = None, model = None):

        super(TreeView, self).__init__(parent = parent)
        self.setDragDropMode(QAbstractItemView.InternalMove)
        self.setDragEnabled(True)
        self.setAcceptDrops(True)

但是,当我拖放源项目保持不变时,它只会丢弃一个重复的项目。 不应该由TreeView处理删除拖动项目吗?如果不是我在哪里手动删除它?

我确信我在这里遗漏了一些东西..

1 个答案:

答案 0 :(得分:3)

您需要在模型中实施removeRows方法;它应该自动调用。