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

How to maintain a link between parent QStandardItems and database row ids in a tree model?

本文关键字:数据库 ID 之间 链接 QStandardItems 模型 维护      更新时间:2023-10-16

我有一个小问题,我正在尝试弄清楚,我正在开发一个使用 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存储在一个数组中,我可以在子循环中引用父级?
  2. QStandardItem* item分配一个 ID 或其他东西,然后我可以在添加孩子时引用它们。
  3. 从数组生成 TreeView 模型,其中子数组元素被添加为子数组元素?
  4. 还有什么我没有想到的...

我似乎找不到任何来自数据库的孩子的QTreeView的好例子。

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