如何在树模型中维护父QStandardItems和数据库行id之间的链接?

时间:2013-09-13 02:36:40

标签: c++ qt qt5

我有一点问题我想弄清楚,我正在使用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的情况下找出它是什么?

故事的道德是,有没有一种方法可以做到以下其中一种不会破坏性能的方法。

  1. QStandardItem* item存储在我可以在childs循环中引用父项的数组中?
  2. QStandardItem* item分配一个ID或其他内容,然后在添加孩子时可以参考。
  3. 从数组生成TreeView模型,其中children数组元素作为子元素添加?
  4. 我没有想到的其他东西......
  5. 我似乎找不到QTreeView与数据库中的孩子有任何好的例子。

1 个答案:

答案 0 :(得分:0)

您需要的只是QMap<int, QStandardItem*> rowItemMap。当您使用给定的行ID从数据库中检索行时,您会立即创建一个项目并将其添加到地图中。然后将其添加到您在地图中查找的父级。您需要创建一个虚拟父项作为根项。存储指向项目的指针没有错。对于合理数量的物品,无关紧要。如果您考虑存储超过10k的项目,您可能想要使用一个视图,该视图提供直到树的某个深度的传递闭包。然后通过QSqlTableModel将这样的视图直接映射到树上会更容易,而不必将整个树从数据库复制到临时模型中。