QtreeView:更新内容而不向上滚动

时间:2015-12-22 12:45:35

标签: qt qtreeview qabstractitemmodel

我正在将QMap<QString, QMap<QString,int>>的内容映射到与QStandardItemModel相关联的QTreeView(其中地图中的每个键都是子QMap中项目的根) 。

当我的应用的其他部分(每隔几秒)更改此地图的内容时,我还需要更新QTreeView。我可以重置模型并使用更新的数据再次填充它,但随后树被“刷新”;它被向上滚动并且根项目被折叠,这是一种糟糕的用户体验。

我找到了基于QAbstractItemModel here (Chapter 10, Figure 10.14)的自定义模型的QT示例,并且数据更改的行为是相同的。

知道如何在不刷新树视图的情况下更新内容吗?

1 个答案:

答案 0 :(得分:-1)

  

我可以重置模型并使用更新的数据再次填充它,但随后树正在刷新&#39 ;;它已向上滚动并且根项目已折叠,这是一种糟糕的用户体验。

这正是您不应该重置模型的原因,而是使用Qt Model / View API提供的细粒度信号/修改:

  • QAbstractItemModel::dataChanged
  • QAbstractItemModel::beginInsertRows / QAbstractItemModel::endInsertRows
  • QAbstractItemModel::beginInsertColumns / QAbstractItemModel::endInsertColumns

等等。现在,如果您正在使用便捷QStandardItemModel类并正确管理它(例如,通过相应的QStandardItem创建/销毁/修改分支),那么视图将很好 - 表现出色,不会失去选择或位置。

否则,您需要提出解决方法,例如&#34;记住&#34;扩展状态/滚动位置/选择;或者将新数据结构与旧数据结构进行比较,找出差异并更新模型;等