Qt:QSqlTableModel + QTableView 与 PostgreSQL 同步

标签 qt postgresql model-view

我正在编写一个用于存储一些数据的数据库访问应用程序,想问一些关于模型/ View 架构的问题。

(使用:Qt 4.7.4,自己构建;PostgreSQL 9.0;目标:WinXP、Win7(32/64 位)) 首先让我解释一下我正在努力实现的目标以及我目前所处的位置。

我有两个页面(子类 QWidgets 插入到 QStackedWidget 中),其中 QTableView 绑定(bind)到一个模型。每个 View 都绑定(bind)到 PostgreSQL 服务器中的一个表。您可以添加/编辑/删除/排序/过滤项目。 每个页面只能被一种类型的用户看到,我们称角色为 Role1 和 Role2。

所有连接到模型的提交策略都是OnManualSubmit。

  1. (事务隔离级别 = 可序列化。)当两个用户想要编辑(例如)同一行时,我想执行“SELECT ... FOR UPDATE”查询 - 以确保当有人编辑时某些东西,他会将他的更改与更新的更改合并(如果有的话,就像在 SVN 中一样)。但我只看到 QSqlTableModel 有一个 submitAll() 方法。 也许捕获信号 beforeUpdate()、beforeDelete()、beforeInsert() 并手动执行“SELECT ... FOR UPDATE”是一种选择。 我认为的另一种方法是子类化 QSqlTableModel。实现这一目标的简洁好方法是什么?

  2. 我想定期更新每个页面的 QSqlTableView(最多可以看到一个页面,角色 1 用户只能访问页面 1,角色 2 => 页面 2 也是如此)。 我想到的第一件事是使用 QTimer 并手动调用 QSqlTableModel 的 select(),但是...不确定这是否是一种很酷的方法。

  3. 我也想定期检查与数据库的连接是否正常,但我认为 QTimer + QSqlDatabase::isOpen () 就可以了。

  4. 现在,2 个表具有相同的主键并且某些列也相同。我希望当具有 Role1 的用户更改 Table1 中的一行时自动更改 Table2 的相应列,反之亦然。我应该在 Postgres 中创建触发器吗?

顺便说一句,数据库很小——两个表中的每一个大约有 3-4000 行,大约 10 列(大部分是 varchars,1 个文本和 2 个日期列)。

感谢阅读,新年快乐! :)

最佳答案

我认为您应该考虑执行以下操作:

我没有使用 QSqlTableModel 作为模型,而是将我自己的模型实现为 QAbstractTableModel 的子类。这将使您能够对数据操作方面的操作进行大量控制。

这将需要的一件事是,对于表中的某些字段,您需要实现 QAbstractItemDelegate 的子类,这将允许修改表中的数据,因为我很确定您不会希望允许用户更新表中的任何字段,例如 primary key 可能必须单独保留。

对于问题 2,我建议为每一行实现一个名为 transaction_counter 的字段,这样您就不必选择表中的每一行,只需更新 transaction_counter 将在每次更新行时更新,并且新的将插入到新行插入中。需要做的一件事是计数器在整个表中是唯一的。例如,如果表的初始状态是:row1 has counter = 0 and row2 has counter = 0。如果 row1 更新,counter 设置为 1。当 row1 再次更新时,其上的 counter 设置为 2。当 row2 现在更新时,它的 counter 设置为 3 等。您现在当然可以使用 QTimer< 进行数据刷新 这将更有利于例如检查数据,因为一个用户可能正在更新与具有相同角色的另一个用户相同的表。

对于问题 3。我看不出有任何理由不自定义模型,特别是如果您决定将数据与模型分开,您可以独立于数据的显示来操作数据。某种Data->Model->View->Controller 实现。只要您有针对代表的反馈机制,就可以单独维护每一个。

对于问题4,答案是肯定的,或者你可以在你的应用中实现触发器。

希望这对您有所帮助。祝你新年快乐!

关于Qt:QSqlTableModel + QTableView 与 PostgreSQL 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8679975/

相关文章:

javascript - 如何在 QML 中访问 ListView 的 ListModel 的 ListElement 的映射委托(delegate)数据?

QTreeView中间列填充宽度空间而不是最后一列

postgresql - 是否可以在 Alfresco 数据库中创建新表?

c# - 我想同时在两个模型上应用 for-each 循环 Asp.Net MVC

android - 如何在 Android 中使用 presentModalViewController?

c - 旋转矩阵缩小物体?

c++ - Qt QMainWindow 中央小部件删除

c++ - 我想在 QT 中使用 LEMUR 库

sql - PostgreSQL - FOR UPDATE SKIP LOCKED 死锁

postgresql - 确定函数中实际查询的模式名称