【问题标题】:QtreeView: update content without scrolling it upQtreeView:更新内容而不向上滚动
【发布时间】:2015-12-22 12:45:35
【问题描述】:

我将QMap<QString, QMap<QString,int>> 的内容映射到连接到QTreeViewQStandardItemModel(其中映射中的每个键都是子QMap 中项目的根)。

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

我发现了一个基于QAbstractItemModelhere (Chapter 10, Figure 10.14) 的自定义模型的QT 示例,并且对数据更改的行为是相同的。

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

【问题讨论】:

    标签: qt qtreeview qabstractitemmodel


    【解决方案1】:

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

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

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

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

    否则,您需要想出解决方法,例如“记住”展开状态/滚动位置/选择;或者比较新的数据结构和旧的数据结构,找出差异,更新模型;等等

    【讨论】:

    • 除了“新旧数据结构对比,发现差异,更新模型”外,你提到的API应该如何使用?
    • 这取决于数据的底层存储。如果您“只是”获得一张全新的地图(而不是更改通知),那么您别无选择,只能尝试自己检测更改并相应地更新模型类。
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2017-03-24
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多