Qt:QSqlTableModel + QTableView与PostgreSQL同步

时间:2011-12-30 13:32:29

标签: qt postgresql model-view

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

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

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

与模型相关的所有内容的提交策略均为OnManualSubmit。

  1. (事务隔离级别= Serializable。)当两个用户想要编辑(例如)同一行时,我想做一个“SELECT ... FOR UPDATE”查询 - 确保当有人编辑时他会将他的更改与新的更改合并(如果有的话,就像在SVN中一样)。但是我只看到了一个提交All()方法的QSqlTableModel。 也许捕获信号beforeUpdate(),beforeDelete(),beforeInsert()并手动执行“SELECT ... FOR UPDATE”是一个选项。 我认为另一种方式是继承QSqlTableModel。实现这一目标的干净而美好的方法是什么?

  2. 我想定期更新每个页面的QSqlTableView(一个页面最多可见,Role1用户只能访问Page1,而Role2 => Page2)。 我想到的第一件事就是使用QTimer并手动调用QSqlTableModel的select(),但是......不确定这是否很酷。

  3. 我还想定期检查与数据库的连接是否正常,但我认为QTimer + QSqlDatabase :: isOpen()会这样做。

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

  5. BTW,数据库很小 - 两个表中的每一个都是3-4000行,大约有10列(主要是varchars,1个文本和2个日期colunms)。

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

1 个答案:

答案 0 :(得分:0)

我认为您应该考虑采取以下措施:

我没有使用QSqlTableModel作为模型,而是将自己的模型实现为QAbstractTableModel的子类。这将允许您在数据操作方面对您可以做的事情进行大量控制。

这需要的一件事是表格中的某些字段,你需要实现QAbstractItemDelegate的子类,这将允许修改表中的数据,因为我相信你不想允许用户更新表中的任何字段(例如primary key)可能不得不单独使用。

对于问题2,我建议为每一行实施一个名为transaction_counter的字段,这样您就不必select表中的每一行transaction_counter将更新row1 has counter = 0 and row2 has counter = 0更新每行更新,新的行将插入新行插入。需要做的一件事是,计数器在整个表格中是唯一的。例如,如果表的初始状态是:row1。如果counter已更新1设置为row1。当counter再次更新2时,它会设置为row2。当counter现在更新3时,它会设置为QTimer等。您现在可以使用Data->Model->View->Controller立即刷新数据,这对于示例检查数据,因为一个用户可能正在使用具有相同角色的另一个用户更新同一个表。

对于问题3.我没有看到为什么不是自定义模型的原因,特别是如果您决定从模型中分离数据,您可以将数据与其显示分开处理。排序{{1}}实施。只要您有代表的反馈机制,每个人都可以单独维护。

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

希望这会有所帮助。祝新年快乐!