如何在 QTreeView 的 QAbstractItemModel 中创建人工节点
-
24-09-2019 - |
题
我的问题是关于 Qt 及其 QA抽象项目模型.
我有一张字符串和双打的映射(std::map<stringclass, double>
)我想在 Qt 小部件中呈现。虽然我可以使用 QTableView 为此,我想利用地图的键具有形式的事实“abc.def.ghi
" 其中可以有多个以 " 开头的字符串abc.def
“ 以及更多以 “ 开头的内容abc
".
所以我想设置一个树数据模型来呈现项目 QTreeView 喜欢
(-) abc
|--(-)def
|--ghi 3.1415
|--jkl 42.0815
|--(+)pqr
|--(+)xyz
我的钥匙 std::map
是树的叶子,其中所有其他节点都是临时和辅助结构,以支持折叠以方便用户。
不幸的是,这些方法 rowCount
, index
, columnCount
, , 和 data
有 const 修饰符,所以我不能简单地为我的标头设置辅助数据结构 QA抽象项目模型 派生并更改其中的数据结构。
最好的做法是什么?我应该在我的之间设置另一个类层吗 std::map
和 QA抽象项目模型 还是有更聪明的方法来做到这一点?
编辑1:这 std::map
可以改变,而 QTreeView 显示和使用,因此辅助节点可能会被丢弃并重建。我的假设是,解决这个问题的最佳方法是重组 QA抽象项目模型 - 或者我应该简单地扔掉该模型并将一个新构建的模型分配给 QTreeView?在这种情况下,我想我可以在构造函数中设置所有节点,而不必担心方法的常量性。
解决方案
我将解析该地图并基于它创建一个树数据结构。确保在更改地图时同步模型。如果此同步步骤变得过于复杂,您可能希望从一开始就将数据保存在树结构中,并在必要时转换为地图。
对我来说,在模型函数中动态解析地图似乎是一个坏主意,您希望这些函数尽可能快。
其他提示
我不明白 const 修饰符真的会成为一个问题。
您的哪些成员 QAbstractItemModel
您想修改导数时 rowCount
, index
, columnCount
和 data
方法被称为?您可以很好地存储对地图的引用,并从中计算所有内容。无需修改地图本身即可提取所需的信息(据我所知!)。
EDIT1 和评论后编辑 :
如果您的地图必然会被修改,请将其用作您自己的类中的基础结构。如果由于模型的生命周期可能超过地图的生命周期而无法保留对地图的引用,请使用智能指针来确保这种情况不会发生。