我想生成一个足够简单的应用程序,它使用QTreeView小部件来显示SQLite3(平面)表中的分层数据,使用QDataWidgetMapper填充一些lineedit字段,允许用户编辑,然后更新表。简单和基本(对大多数人来说!)。在
我一直认为,以下流程将是实现这一目标的最佳方式:
dict
操作它来动态创建节点、父节点和子节点-对于每个dict条目,都会生成一个带有关联父节点的'node')我意识到如果我只是使用QTableView或QListView,我就不需要定制模型,可以直接写回数据库。我在上面概述的过程似乎意味着必须保留两组数据,即SQLite表和自定义QAIM,并确保它们都是最新的。这对我来说似乎有点麻烦,我相信一定有更好的方法来实现,QTreeView直接从SQLite表中获取数据,显然需要一些操作来将平面数据转换为分层数据。在
当然,我在想,我是否完全误解了QAbstractItemModel和QSQL*模型之间的关系,而我是否因为无知而过度复杂化了它?在
谢谢
您需要的是一个代理模型,它充当
QSql*Model
和视图之间的桥梁。为此,您需要子类QAbstractProxyModel
。您必须有一种在代理模型中找到父子关系并将它们映射到源模型的一致方法,这样可能需要在代理模型中保持一些平衡。在在对
QAbstractProxyModel
进行子分类时,至少需要重新定义以下方法:另外,请记住,
QAbstractProxyModel
不会自动传播信号。因此,为了让视图知道源模型中的更改(如insert、delete、update),您需要在代理模型中传递它们(当然,更新代理模型中的映射)。在这将需要一些工作,但最终你会有一个更灵活的结构。它将消除同步数据库和自定义
QAbstractItemModel
所需的所有工作。在编辑
根据给定列对平面模型中的项进行分组的自定义代理模型:
^{1}$相关问题 更多 >
编程相关推荐