qt-pyside-qsql*模型、qabstractitemmodel和qtreeview交互作用

2024-10-03 19:31:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想生成一个足够简单的应用程序,它使用QTreeView小部件来显示SQLite3(平面)表中的分层数据,使用QDataWidgetMapper填充一些lineedit字段,允许用户编辑,然后更新表。简单和基本(对大多数人来说!)。在

我一直认为,以下流程将是实现这一目标的最佳方式:

  1. 连接到数据库
  2. 查询数据
  3. 从数据中创建并填充定制的qabstractemodel(通过dict操作它来动态创建节点、父节点和子节点-对于每个dict条目,都会生成一个带有关联父节点的'node')
  4. 使用QDatawidgetmapper填充其他小部件
  5. 用户编辑数据
  6. QAbstractItemModel(QAIM)已更新
  7. 然后必须在QAIM模型中使用新值运行更新、插入或任何查询。在
  8. 刷新QAIM和相关的小部件。在

我意识到如果我只是使用QTableView或QListView,我就不需要定制模型,可以直接写回数据库。我在上面概述的过程似乎意味着必须保留两组数据,即SQLite表和自定义QAIM,并确保它们都是最新的。这对我来说似乎有点麻烦,我相信一定有更好的方法来实现,QTreeView直接从SQLite表中获取数据,显然需要一些操作来将平面数据转换为分层数据。在

当然,我在想,我是否完全误解了QAbstractItemModel和QSQL*模型之间的关系,而我是否因为无知而过度复杂化了它?在

谢谢


Tags: 数据用户模型数据库应用程序编辑sqlite节点
1条回答
网友
1楼 · 发布于 2024-10-03 19:31:25

您需要的是一个代理模型,它充当QSql*Model和视图之间的桥梁。为此,您需要子类QAbstractProxyModel。您必须有一种在代理模型中找到父子关系并将它们映射到源模型的一致方法,这样可能需要在代理模型中保持一些平衡。在

在对QAbstractProxyModel进行子分类时,至少需要重新定义以下方法:

  • 行数
  • 列计数
  • 家长
  • 索引
  • 数据
  • 映射源
  • 映射源

另外,请记住,QAbstractProxyModel不会自动传播信号。因此,为了让视图知道源模型中的更改(如insert、delete、update),您需要在代理模型中传递它们(当然,更新代理模型中的映射)。在

这将需要一些工作,但最终你会有一个更灵活的结构。它将消除同步数据库和自定义QAbstractItemModel所需的所有工作。在

编辑

根据给定列对平面模型中的项进行分组的自定义代理模型:

^{1}$

相关问题 更多 >