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

本文介绍了如何在PySide2环境下,基于QAbstractItemModel实现TreeModel的元素插入与删除操作。通过自定义TreeModel和TreeItem,详细展示了将C++代码转换为Python的过程,讨论了现有代码的局限性,并提供了更灵活的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景介绍

基于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实现行列的插入与删除》:系列教程之十一


以上,欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值