如何处理与 PyQt5

问题描述

我正在开发一个 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)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...