You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 22:02:31