QJsonTreeModel删除行异常:仅根元素可正确删除,子元素删除错位问题求助
问题根源与修复方案
这个问题的核心是QJsonTreeItem类中的getItem方法逻辑完全颠倒,导致你在删除子元素时,错误地获取了根节点作为父节点,从而删错了位置。下面是具体的修复步骤和优化建议:
1. 修复QJsonTreeItem的getItem方法
原方法的判断逻辑搞反了:当传入的index是有效的时候,反而会进入无效分支,错误地返回根节点。正确的逻辑应该是:
- 若index有效,返回其内部指向的item
- 若index无效(比如根节点的父index),返回根节点
修改后的代码:
class QJsonTreeItem(object): def __init__(self, data, parent=None): self._parent = parent self._key = "" self._value = "" self._type = None self._children = list() self.itemData = data ... def getItem(self, index): if index.isValid(): item = index.internalPointer() if item: return item return self._rootItem
2. 优化QJsonTreeModel的removeRows方法
原方法存在两个小问题:
- 没有检查
removeChildren的返回结果,删除失败时也会执行视图更新 - 额外发送
layoutChanged信号,会干扰beginRemoveRows/endRemoveRows的正常视图更新流程
修改后的代码:
def removeRows(self, position, rows, parent): parentItem = self.getItem(parent) # 先校验删除范围是否合法 if position < 0 or position + rows > len(parentItem._children): return False self.beginRemoveRows(parent, position, position + rows - 1) success = parentItem.removeChildren(position, rows) self.endRemoveRows() # 不需要手动发送layoutChanged,begin/end已自动处理视图更新 return success
3. 优化主窗口的treeItemDelete方法(可选)
增加选中项的有效性检查,避免无效操作:
def treeItemDelete(self): index = self.treeView.selectionModel().currentIndex() if not index.isValid(): return # 无有效选中项,直接返回 self.model.removeRows(position=index.row(), rows=1, parent=index.parent())
为什么之前会删错元素?
当你删除子元素(比如"index")时,它的父index是有效的,但原getItem方法进入了not index.isValid()分支,错误地返回了根节点。这导致删除操作实际是在根节点的子列表中执行,自然会删错成根节点下的"asd"元素,而不是目标子元素的父节点下的对应项。
内容的提问来源于stack exchange,提问作者Leonid
相关产品推荐
相关产品推荐

