背景介绍
基于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实现行列的插入与删除》:系列教程之十一
以上,欢迎交流。