首页 > 解决方案 > QModel中父母/孩子的QTreeView值改变了

问题描述

我有一个分层数据结构,我将其包装在 QModel(继承自 QAbstractItemModel)中,并在 QTreeView 中显示和编辑它。

假设 QTreeView 显示以下数据:

Item1  
|----Item2  
     |----Item3  
          |-----Item4  
                |----Item5

现在将发生以下情况:
1) 我编辑 Item3 并将其值更改为 Item3_a。
2) QModel 识别变化并将包装模型中父母和孩子的项目值更改为:

Item1_a
|----Item2_a
     |----Item3_a
          |-----Item4_a
                |----Item5_a

3) QTreeView 由模型通知有关其他更改(Item1、2、4 和 5)。仅更改显示的值。层次结构保持不变。

我的问题针对第 3 步:

如何正确通知 QTreeView 更改的数据?

这是我尝试过的:

我知道有modelReset,但是 QTreeView 被折叠了。但是,它应该保持其折叠/展开状态。

根据文档,使用setData具有不同父索引的模型方法会给出未定义的行为。我尝试从 setData 为每个父/子递归调用 setData,但这会导致程序崩溃。

我正在使用qt5。

标签: qtmodeltreeviewsignals-slots

解决方案


很确定您正在寻找的是“rowsInserted”以及与之相关的方法。“dataChanged”信号指示给定单元格(或范围)已更改值;这与更改表结构无关。

您在这里所做的是在将条目从一个父级移动到另一个父级时删除和插入行。您需要实现与此相关的所有方法。还有一个“rowsMo​​ved”可能更适合您的需求。


推荐阅读