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

修改QTreeWidgetItem的ItemIsEditable标志时如何避免无限递归

问题根因

QTreeWidgetItem.setFlags() 方法会触发 QTreeWidget.itemChanged 信号,而你已经将该信号绑定到了 save_password 槽函数,槽函数执行到末尾修改条目flags时会再次触发itemChanged信号,最终形成无限递归循环。

解决方案

修改save_password槽函数中修改条目flags的代码,临时阻塞条目的信号发射即可解决:

@pyqtSlot(QTreeWidgetItem, int)
def save_password(self, item, column):
    if not self.__ready:
        return

    for client in self.data["clients"]:
        if client["name"] == item.parent().parent().text(0):
            for workstation in client["workstations"]:
                if workstation["name"] == item.parent().text(1):
                    for login in workstation["logins"]:
                        if login["username"] == item.text(2):
                            login["password"] = item.text(3)

    with open("list.json", "w") as file:
        json.dump(json.loads(self.data.to_json()), file, indent=4)

    # 临时阻塞信号,避免触发递归
    item.blockSignals(True)
    item.setFlags(item.flags() & ~Qt.ItemIsEditable)
    item.blockSignals(False)

可选优化建议

你当前三层循环查找对应登录条目的逻辑性能较差,可以在创建第三层条目时直接把对应login对象绑定到条目的自定义数据字段,后续保存时直接读取即可,无需遍历:

  1. 在__load_data__创建第三层条目时添加代码:
row_3.setData(Qt.UserRole, login)
  1. 保存时直接修改绑定的对象属性:
login = item.data(Qt.UserRole, 0)
login["password"] = item.text(3)

内容的提问来源于stack exchange,提问作者CodePidgy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:27:06