在Qt中表示相关模型的最佳方式是什么?

在Qt中表示相关模型的最佳方式是什么?,qt,model-view,Qt,Model View,我有一个构建在管理SQL数据库的库之上的Qt应用程序。我有几个模型(QAbstractTableModel和QAbstractListModel子类),它们表示数据库中的不同表,并且我有一些关联的视图 这些模型通常具有来自数据库的数据缓存和指向数据库对象的指针,可以根据需要刷新缓存。我已经实现了insertRows、removeRows和setData,以便它们在事务中尝试数据库操作,然后如果成功,它们将更新beginInsertRows()/endInsertRows()内的缓存(或根据情况进

我有一个构建在管理SQL数据库的库之上的Qt应用程序。我有几个模型(QAbstractTableModel和QAbstractListModel子类),它们表示数据库中的不同表,并且我有一些关联的视图

这些模型通常具有来自数据库的数据缓存和指向数据库对象的指针,可以根据需要刷新缓存。我已经实现了insertRows、removeRows和setData,以便它们在事务中尝试数据库操作,然后如果成功,它们将更新beginInsertRows()/endInsertRows()内的缓存(或根据情况进行删除),以便缓存不会在开始/结束对外更改,并且所有内容都保持同步

到目前为止,一切正常。如果对数据库的所有更改都来自GUI,我认为这是一个很好的解决方案

问题在于,某些数据库操作涉及更改由多个模型表示的表。对于应用程序来说,它看起来像是源于数据库层的表更新。我可以随时让数据库层调用到模型层(这就是我现在正在做的),但我不喜欢它将较低级别的数据库层暴露给Qt模型的方式。它还有一个问题,即模型需要在事务中进行更改,以便知道操作何时成功或失败,并且通过模型层将阻止数据库层在事务中包含多个更新

或者,我可以使模型中的缓存成为“真实”数据。然后,我可以更改底层数据库,并在事后通知模型,此时他们将更新缓存。我认为这适用于小表,但因为这意味着缓存整个表,所以我认为它不适用于大表

我的想法是,这是一个足够普遍的问题,可能是某种已知的最佳实践。是这样吗


谢谢。

您描述的内容与
QSqlQueryModel
QSqlTableModel
非常相似。您是否考虑过使用它们而不是您自己的实现?但是,它们也没有更新机制。您不需要向模型公开数据库层。例如,当数据库中发生更改时,您可以发送一个信号,并将此信号连接到更新它们的模型插槽。我不使用Qt内置Sql类,只是因为我已经有一个管理数据库的库(因此非Qt程序不会复制代码)。当数据库层进行修改时,调用beginInsertRows/beginRemoveRows/etc已经太晚了,这难道不是一个信号的问题吗。?