我有一点问题我想弄清楚,我正在使用QTreeView的QT应用程序,我有一堆有孩子的类别,所以看起来像
Parent 1
Parent 2
- Child 1
- Child 2
Parent 3
等等,所以在我的数据库中,我有一些行,这些行包含所有常规细节(名称,id,创建日期等),而那些是子节点的行指定了父节点(所以pid =父行id )。然后我循环然后使用标准的QSqlQuery东西。但我遇到的问题是......
通过QStandardItem* item = new QStandardItem(icon, name);
将项目添加到树视图中,然后添加行model->appendRow(item);
,但我的孩子需要调用parentitem->appendRow(item);
以及父级的QStandardItem* item
。但是,如何在不存储每一个item
的情况下找出它是什么?
故事的道德是,有没有一种方法可以做到以下其中一种不会破坏性能的方法。
QStandardItem* item
存储在我可以在childs循环中引用父项的数组中?QStandardItem* item
分配一个ID或其他内容,然后在添加孩子时可以参考。我似乎找不到QTreeView与数据库中的孩子有任何好的例子。
答案 0 :(得分:0)
您需要的只是QMap<int, QStandardItem*> rowItemMap
。当您使用给定的行ID从数据库中检索行时,您会立即创建一个项目并将其添加到地图中。然后将其添加到您在地图中查找的父级。您需要创建一个虚拟父项作为根项。存储指向项目的指针没有错。对于合理数量的物品,无关紧要。如果您考虑存储超过10k的项目,您可能想要使用一个视图,该视图提供直到树的某个深度的传递闭包。然后通过QSqlTableModel
将这样的视图直接映射到树上会更容易,而不必将整个树从数据库复制到临时模型中。