修改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对象绑定到条目的自定义数据字段,后续保存时直接读取即可,无需遍历:
- 在
__load_data__创建第三层条目时添加代码:
row_3.setData(Qt.UserRole, login)
- 保存时直接修改绑定的对象属性:
login = item.data(Qt.UserRole, 0) login["password"] = item.text(3)
内容的提问来源于stack exchange,提问作者CodePidgy
相关产品推荐
相关产品推荐

