从标题中可以看出,我使用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()但它似乎不是唯一的。
非常感谢。
答案 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查询上注释整个树的情况,则需要根据树的属性调整遍历的顺序。