PyQt5 QTreeView更新数据需重建模型问题及优化方案咨询
问题原因
TreeViewModel初始化时会将传入的节点一次性挂载到内部的_root根节点中,后续修改外部节点列表不会同步更新模型内部存储的节点结构,因此仅发送layoutChanged信号无法触发视图刷新,只有新建模型重新挂载节点才能生效。
优化方案
不需要每次新建模型,只需给自定义TreeViewModel增加符合Qt规范的重置节点方法即可,修改后的核心代码如下:
- 给
TreeViewModel类新增节点重置方法:
class TreeViewModel(QtCore.QAbstractItemModel): # 原有代码保持不变 def reset_nodes(self, nodes): # 调用Qt标准模型重置前置接口,通知视图即将刷新数据 self.beginResetModel() # 清空原有根节点下的所有子节点 self._root._children.clear() # 挂载新的节点数据 for node in nodes: self._root.addChild(node) # 调用Qt标准模型重置后置接口,自动触发视图刷新 self.endResetModel()
- 修改主部件的点击槽函数,移除新建模型、重设模型的冗余代码:
def slot_select_tree(self): self.items.clear() root = self.sender().text() data = self.tree_datas.get(root) self.items.append(CustomNode(root)) for i in data: self.items[-1].addChild(CustomNode(i)) # 直接调用模型重置方法即可完成更新 self.model.reset_nodes(self.items) self.treeview.expandAll()
beginResetModel()和endResetModel()是Qt提供的模型数据重置标准接口,调用后会自动通知视图完成全量数据刷新,不需要手动发送layoutChanged信号,兼容性和性能都优于反复新建模型的写法。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

