Qt:将树(QTreeView + QStandardItemModel)存储在数据库表中

时间:2018-03-06 16:38:45

标签: sql qt qtreeview qstandarditemmodel qmodelindex

从标题中可以看出,我使用QStandardItemModel来存储树结构。我在QTreeView中操作这个结构,而不是我需要以这种格式将它保存在数据库中:

|id|Parent|Child |
| 1|      |ITEM01|
| 2|     1|ITEM02|
| 3|     2|ITEM03|
| 4|     3|ITEM04|
| 5|     4|ITEM05|
| 6|     5|ITEM06|
| 7|     6|ITEM07|
| 8|     3|ITEM08|
| 9|     3|ITEM09|
|10|     3|ITEM10|

代表这种结构:

ITEM01
 ║
 ╠═► ITEM02
 ║    ║
 ║    ╚═► ITEM03
 ║         ║
 ║         ╠═► ITEM04
 ║         ║    ║
 ║         ║    ╚═► ITEM05
 ║         ║         ║
 ║         ║         ╚═► ITEM06
 ║         ║              ║
 ║         ║              ╚═► ITEM07
 ║         ║
 ║         ╠═► ITEM08
 ║         ╠═► ITEM09
 ║         ╚═► ITEM10
换句话说,“id”表示唯一的节点,字段“parent”是对父节点的引用。根节点是一个空字段。

我的问题是:如何从QStandardItemModel获取唯一ID(以int格式)? 我尝试过使用QModelIndex :: row()和QPersistentModelIndex :: row()但它似乎不是唯一的。

非常感谢。

1 个答案:

答案 0 :(得分:1)

最简单的方法是在以某个深度优先顺序遍历树时,从递增计数器中分配索引,例如, postorder - left ... right,root。

如果您将.something-container{ position:relative; text-align: center; } .something-img{ width: 100%; } .something-text{ position: absolute; text-align: center; top: 50%; left: 50%; transform: translate(-50%, -50%); background: rgba(0, 0, 0, 0.7); color: white; p { line-height: 2em; padding-left: 10px; } h1 { text-transform: uppercase; font-weight: 550; padding-top: 20px; } } id存储为元素的角色,那么:

parent

稍作修改可以将int assignIdsPostorder(QStandardItem * e, int idRole, int parentRole, int counter = 0) { auto const N = e->rowCount(); for (int i = 0; i < N; ++i) counter = assignIdsDFS(e->child(i), idRole, parentRole, counter); if (e->setData(counter, idRole)) counter++; for (int i = 0; i < N; ++i) e->child(i)->setData(e->data(idRole), parentRole); return counter; } id存储在各个列中。

如果索引不需要一直有效,那么你可以通过memoization(缓存)懒惰地生成它们。 parent派生的元素将重新实现QStandardItem以执行部分​​树遍历以生成其data()。如果您想要避免可能必须在单个id查询上注释整个树的情况,则需要根据树的属性调整遍历的顺序。