我有一个小问题,我正在尝试弄清楚,我正在开发一个使用 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
存储在一个数组中,我可以在子循环中引用父级? - 为
QStandardItem* item
分配一个 ID 或其他东西,然后我可以在添加孩子时引用它们。 - 从数组生成 TreeView 模型,其中子数组元素被添加为子数组元素?
- 还有什么我没有想到的...
我似乎找不到任何来自数据库的孩子的QTreeView的好例子。
您所需要的只是一个QMap<int, QStandardItem*> rowItemMap
。从数据库中检索具有给定行 ID 的行时,会立即创建一个项目并将其添加到地图中。然后,将其添加到在地图中查找的父项。您需要创建一个虚拟父项作为根项。存储指向项目的指针没有错。对于合理数量的物品,这并不重要。如果您考虑存储超过 10k 个项目,则可能需要考虑使用在树的一定深度内提供传递闭包的视图。这样,通过QSqlTableModel
将这样的视图直接映射到树上会容易得多,而不必将整个树从数据库复制到临时模型中。