问题描述
我正在开发一个 GUI 应用程序,据推测它将被多个用户使用。在我的应用程序中,我使用 QAbstractTableModel 在 QTableView 中显示 MS Access 数据库(存储在本地服务器上,由多台 PC 访问)。我开发了独特的用户交互所需的一切。但现在我要考虑多用户交互。
例如,如果用户 A 更改了特定行,则用户 B PC 上的应用程序实例需要更新更改的行。再比如,如果用户A正在修改某行,而用户B也想修改,则需要通知“已经修改,请稍候”,一旦用户A的修改完成,用户B需要在他进行任何交互之前查看此修改的更新。
今天,由于 MS Access 数据库的本地特性,我不得不根据用户交互更新表视图很多时间,以免错过其他潜在用户的任何数据库修改。它在性能和资源方面有点贪婪。
我曾考虑使用 Django 来让不同的应用程序实例相互通信,但也许我想得太多了,可能还有其他解决方案。
不知道是否清楚,我可以提供更多信息!
解决方法
也许您可以简单地在行上存储“lastUpdated”时间戳。每次更新时,您都会更新该时间戳。
现在,当您提交更新时,您将包含该时间戳,如果时间戳不匹配,您会通知用户,并在前端处理冲突(也许是一个简单的“覆盖本地副本,或强制更新”)并覆盖服务器副本”选项)。
这是一个简单而强大的解决方案,但如果您不希望用户浪费时间为旧行编写更新,您可以使用 WebSockets 从服务器与打开该行进行编辑的任何客户端进行通信,并让他们知道该行已更新。
如果您想在行已经被编辑时“锁定”行,您可以简单地存储一个“inUse”布尔值,并让用户在继续之前检查该值。
,通常,当使用 MVC 模式(这就是 QAbstractTableModel + QTableView)时,更新视图的责任应该在于模型本身。 IE。模型应该通知视图发生了一些变化。
似乎 QAbstractTableModel
有一个 dataChanged
信号,可在数据更改时发出。
我建议您将它连接到您的视图 refresh
插槽 here。
通过这种方式,您无需使用另一个移动部件/基础设施组件 (django)。