2

我的问题是关于 Qt 及其QAbstractItemModel

我有一个字符串和双精度 ( std::map<stringclass, double>) 的映射,我想在 Qt 小部件中呈现它。虽然我可以为此使用QTableView,但我想利用地图的键是“ abc.def.ghi”形式的事实,其中可以有多个以“ abc.def”开头的字符串,甚至更多以“”开头的字符串abc

所以我想设置一个树数据模型来呈现QTreeView中的项目,比如

(-) abc
    |--(-)def      
          |--ghi    3.1415
          |--jkl    42.0815
    |--(+)pqr
    |--(+)xyz

my 的键std::map是树的叶子,所有其他节点都是临时和辅助构造,以支持折叠以方便用户使用。

不幸的是,方法rowCountindexcolumnCountdata有 const 修饰符,所以我不能简单地为我的QAbstractItemModel派生中的标题设置一个辅助数据结构并在那里更改该数据结构。

什么是最好的做法?我应该在我std::map的和QAbstractItemModel之间设置另一个类层还是有更聪明的方法来做到这一点?


编辑 1:在显示和使用QTreeViewstd::map时可以更改,因此辅助节点可能会被丢弃并重建。我的假设是处理此问题的最佳方法是重组QAbstractItemModel - 还是我应该简单地丢弃该模型并将新构造的模型分配给QTreeView?在那种情况下,我想我可以在构造函数中设置所有节点,而不会被方法的 const 性所困扰。

4

2 回答 2

4

我会解析地图并基于它创建一个树数据结构。确保在更改地图时同步模型。如果此同步步骤变得过于复杂,您可能希望从一开始就将数据保存在树结构中,并在必要时转换为地图。

在模型函数中动态解析地图对我来说似乎是个坏主意,您希望这些函数尽可能快。

于 2010-02-01T16:56:16.720 回答
0

我不明白 const-modifiers 真的会成为一个问题。

在调用、和方法时,QAbstractItemModel您希望修改派生的哪些成员?您可以很好地存储对地图的引用,并从中计算所有内容。无需修改地图本身来提取所需的信息(据我所知!)。rowCountindexcolumnCountdata

在 EDIT1 和评论之后编辑
如果您的地图一定会被修改,请将其用作您自己班级的基础结构。如果由于模型的生命周期可能超过地图的生命周期而无法保留对地图的引用,请使用智能指针确保它不会发生。

于 2010-02-01T11:07:24.670 回答