我的问题是关于Qt及其QAbstractItemModel。
我有一个字符串和双打(std::map<stringclass, double>
)的地图,我想在Qt小部件中呈现。虽然我可以使用QTableView,但我想利用这样一个事实,即地图的键格式为“abc.def.ghi
”,其中可以有多个字符串,可以以“{{1}开头“甚至更多以”abc.def
“开头。
所以我想设置树数据模型来呈现QTreeView中的项目
abc
我的(-) abc
|--(-)def
|--ghi 3.1415
|--jkl 42.0815
|--(+)pqr
|--(+)xyz
的键是树的叶子,其中所有其他节点都是临时的和辅助构造以支持折叠以方便用户。
不幸的是,方法std::map
,rowCount
,index
和columnCount
都有const修饰符,所以我不能简单地为我内部的标题设置辅助数据结构QAbstractItemModel导出并更改那里的数据结构。
最佳做法是什么?我应该在data
和QAbstractItemModel之间设置另一个类层,还是有更智能的方法来执行此操作?
编辑1:显示和使用QTreeView时std::map
可能会发生变化,因此辅助节点可能会被丢弃并重建。我的假设是,处理这个的最好方法是重构QAbstractItemModel - 或者我应该简单地抛弃那个模型并将新构造的模型分配给QTreeView?在那种情况下,我可以在构造函数中设置所有节点,而不会被方法的常量所困扰,我想。
答案 0 :(得分:4)
我将解析地图并基于它创建树数据结构。确保在更改地图时同步模型。 如果此同步步骤过于复杂,您可能希望从一开始就将数据保存在树结构中,并在必要时转换为地图。
在模型函数中即时解析地图对我来说似乎是一个坏主意,你希望这些函数尽可能快。
答案 1 :(得分:0)
我不知道const修饰符是如何真正成为问题的。
在调用QAbstractItemModel
,rowCount
,index
和columnCount
方法时,您想要修改data
衍生物的哪些成员?您可以很好地存储对地图的引用,并从中计算所有内容。无需修改地图本身以提取所需信息(据我所知!)。
在EDIT1之后编辑并发表评论:
如果您的地图必须修改,请将其用作您自己班级的基础结构。
如果由于模型的生命周期可能超过地图而无法保留对地图的引用,请使用智能指针以确保它不会发生。