【问题标题】:Using QAbstractItemModel to represent data in a SQL database使用 QAbstractItemModel 表示 SQL 数据库中的数据
【发布时间】:2013-01-28 17:24:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的问题是什么?当然,您可以继承 QAbstractItemModel。而且您不必在内存中复制数据库。但是您将如何从QAbstractItemModel::data 返回随机 请求的数据?每次都查询?还是创建内存缓存?
  • 嗯,第一个问题是这是否是一个好主意,或者是否没有人这样做的例子,因为存在一些基本问题。我的想法是每次都进行查询。我还对问题进行了更具体的编辑。

标签: sql qt model


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多