0

我正在尝试创建一个 QTreeView 来显示来自 SQL 数据库的数据。这是一个大型数据库,因此简单地将数据加载到 QStandardItemModel 似乎令人望而却步。

Qt 的预构建 SQL 模型类都不足以完成该任务。因此,似乎有必要对 QAbstractItemModel 进行子类化。

首先,我找不到这样做的例子,所以我想知道这是否是正确的方法。

实现 QAbstractItemModel::data 非常简单。我不确定如何实现 QAbstractItemModel::parent。

Qt 的“简单树模型示例”示例将提供信息,但在该示例中,树结构在内存中用 TreeItem 类表示。我可以复制它,但如果我要复制数据库结构,那么使用 QStandardItemModel 将同样容易。如果我需要维护一个单独的数据结构(除了数据库和 QAbstractItemModel 子类)来表示树结构,那么将 QAbstractItemModel 子类化比仅使用 QStandardItemModel 有什么优势吗?

4

1 回答 1

0

树结构中的挑战是始终能够识别模型索引的父级(即重载 parent() 方法)。在简单树示例中,这是通过将三个结构存储在单独的数据结构中来完成的。对于大型 SQL 查询,这是不切实际的。对于正确的数据库结构,您可能能够计算给定子节点的正确父节点,但这不是保证。我能想象的唯一选择是将 quint32 传递给 QAbstractItemModel::createIndex ,它对项目的父项进行编码。

一种可能有用的性能考虑因素。在放弃子类化 QAbstractItemModel 之后,我尝试从数据库中填充一个 QStandardItemModel。我将大约 1200 个项目加载到模型中,并为每个项目加载了四个子项目,并使用两个单独的数据库调用。在 2009 年的笔记本电脑上,这需要大约 3 秒。这比我预期的要快。(如果我使用单个查询而不是重复查询,则会有性能提升。)

最后我选择了另一条路线:在 GUI 中有几个 QTableView,用信号和槽来显示数据的不同方面。我的代码要简单得多,并且具有适当的功能,所以这感觉像是“正确”的解决方案。

于 2013-01-31T06:47:59.870 回答