如何在QTreeView中为QTreeItemModel创建人工节点

时间:2010-02-01 10:42:20

标签: c++ qt qtreeview qabstractitemmodel qtgui

我的问题是关于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::maprowCountindexcolumnCount都有const修饰符,所以我不能简单地为我内部的标题设置辅助数据结构QAbstractItemModel导出并更改那里的数据结构。

最佳做法是什么?我应该在dataQAbstractItemModel之间设置另一个类层,还是有更智能的方法来执行此操作?


编辑1:显示和使用QTreeViewstd::map可能会发生变化,因此辅助节点可能会被丢弃并重建。我的假设是,处理这个的最好方法是重构QAbstractItemModel - 或者我应该简单地抛弃那个模型并将新构造的模型分配给QTreeView?在那种情况下,我可以在构造函数中设置所有节点,而不会被方法的常量所困扰,我想。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

我不知道const修饰符是如何真正成为问题的。

在调用QAbstractItemModelrowCountindexcolumnCount方法时,您想要修改data衍生物的哪些成员?您可以很好地存储对地图的引用,并从中计算所有内容。无需修改地图本身以提取所需信息(据我所知!)。

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