【发布时间】:2018-07-23 08:39:09
【问题描述】:
我有一个模型,它通过某个 SQL 查询从数据库中的表中检索数据,并在 QTreeView 中显示这些项目。特点是:
- 数据来自表,但具有底层树结构(某些行是父行,其下方的行是子行)
- 此树结构显示在 QTreeView 中
- 子项在 QTreeView 中是可选的(不是父项)
- 数据库中的表不断更新
- 在更新中,可以将子级添加到任何现有父级中
- 定期(使用 QTimer)QTreeView 使用表的内容进行更新
由于子项随时添加到任何父项,更新 QTreeView 时第一个愚蠢的方法是将其全部清除,并以父项或子项的形式再次将所有行附加到 QTreeView。这是一个 0 阶的近似值,它确实是非常低效的。尤其会出现以下问题:
- 任何现有的选择都消失了
- 显示其子级的任何展开的父级都将折叠(除非 ExpandAll 处于活动状态)
- 视图被重置以显示第一行。
这个问题的最佳解决方案是什么?我的意思是,我将尝试的第一个解决方案不是清除 QTreeView,而是解析表中所有返回的行,并检查每个行是否存在 QTreeView 中的相应项,如果不存在则添加。但我想知道是否有一个最棘手的解决方案来使用 QTreeView 将数据库中的给定表(我知道 QTableView 存在这种情况,但是树结构消失了)。
【问题讨论】:
-
你知道应该更新哪个节点吗?换句话说,您是否有关于应该添加到树中的每个特定项目的信息?
-
检索到的第一列(未显示在 QTreeView 中)包含一个索引值,它应该告诉我这个项目是父项还是子项,查看当前 QTreeView 我应该看看这是否是是否已经在视图中。
-
我相信,如果您使用
beginInsertRows和endInsertRows正确插入新项目,树视图选择和节点状态将保留为更新树之前的状态。 -
好的,我会尽力告诉你的,谢谢!
-
最后,在仔细分析从数据库中检索到哪些数据之后,只询问以前未获得的记录,并使用几个内部 ID 对数据进行分组和排序,并且还仔细使用了 beginInsertRows() 和 endInsertRows(),接收模型更新的 QTreeView 中的当前位置和选择被保留,并且视图中的项目被添加并且对用户透明地更新视图。顺便说一句,就我而言,在每次更新后重新应用排序状态也很重要。谢谢大家!