我正在将QMap<QString, QMap<QString,int>>
的内容映射到与QStandardItemModel
相关联的QTreeView
(其中地图中的每个键都是子QMap中项目的根) 。
当我的应用的其他部分(每隔几秒)更改此地图的内容时,我还需要更新QTreeView
。我可以重置模型并使用更新的数据再次填充它,但随后树被“刷新”;它被向上滚动并且根项目被折叠,这是一种糟糕的用户体验。
我找到了基于QAbstractItemModel
here (Chapter 10, Figure 10.14)的自定义模型的QT示例,并且数据更改的行为是相同的。
知道如何在不刷新树视图的情况下更新内容吗?
答案 0 :(得分:-1)
我可以重置模型并使用更新的数据再次填充它,但随后树正在刷新&#39 ;;它已向上滚动并且根项目已折叠,这是一种糟糕的用户体验。
这正是您不应该重置模型的原因,而是使用Qt Model / View API提供的细粒度信号/修改:
QAbstractItemModel::dataChanged
QAbstractItemModel::beginInsertRows
/ QAbstractItemModel::endInsertRows
QAbstractItemModel::beginInsertColumns
/ QAbstractItemModel::endInsertColumns
等等。现在,如果您正在使用便捷QStandardItemModel
类并正确管理它(例如,通过相应的QStandardItem
创建/销毁/修改分支),那么视图将很好 - 表现出色,不会失去选择或位置。
否则,您需要提出解决方法,例如&#34;记住&#34;扩展状态/滚动位置/选择;或者将新数据结构与旧数据结构进行比较,找出差异并更新模型;等