我正在尝试找出一个小问题,我正在使用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或其他内容,以便在添加孩子时可以参考。
从数组生成TreeView模型,将子级数组元素添加为子级?
我没想到的其他事...


我似乎找不到数据库中带有子项的QTreeView的任何好例子。

最佳答案

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

关于c++ - 如何在树模型中维护父QStandardItems和数据库行ID之间的链接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18777395/

10-09 05:23