PySide2下QAbstractItemModel实现元素的插入与删除

背景介绍

基于QAbstractItemModel自定义了TreeModel,并自定义了TreeItem。
由于集成自QAbstractItemModel,需要手动撰写删除和添加对象的代码。

代码一

参考文献中的代码为C++,改写为Python后代码如下

    def insertRows(self, row, count, parent:QModelIndex):
        # 调用insertRow()会自动调用重写的insertRows()
        parentItem = parent.internalPointer()
        self.beginInsertRows(parent, row, row + count - 1)
        for i in range(row, row + count):
            item = CTreeItem('测试', parent=parentItem)
            parentItem.insertChild(i, item)
        self.endInsertRows()

    def removeRows(self, row, count, parent:QModelIndex):
        parentItem = parent.internalPointer()
        self.beginRemoveRows(parent, row, row + count - 1)
        for i in range(row, row + count):
            parentItem.removeChild(i)
        self.endRemoveRows()
        return True

这种方式应用场景较窄,不够灵活,不适用于添加更为复杂的对象,因此参照这段代码,按照个人需求进行了改写。

代码二

    def insertItem(self, name, graphicsItem, parentItem):
        # 调用insertRow()会自动调用重写的insertRows()
        row = parentItem.childCount()
        self.beginInsertRows(QModelIndex(), row, row)
        item = CTreeItem(name, graphicsItem=graphicsItem, parent=parentItem)
        parentItem.insertChild(row, item)
        self.endInsertRows()
        return True

    def removeItem(self, name, graphicsItem, parentItem:CTreeItem):
        # 调用insertRow()会自动调用重写的insertRows()
        row = parentItem.childCount()
        self.beginRemoveRows(QModelIndex(), row, row)
        for i in range(row):
            child = parentItem.child(i)
            # 判断若为指定对象,则删除
            if child and child.graphicsItem == graphicsItem and name == child.name:
                parentItem.removeChild(i)
        self.endRemoveRows()

参考资料:
[1] 《QTreeView实现行列的插入与删除》:系列教程之十一


以上,欢迎交流。

你可能感兴趣的:(PySide2,PySide2,python,TreeModel,目录,Qt)