Qt - 同一个应用程序的多个副本打开&设置同步

时间:2010-05-17 13:44:54

标签: c++ qt

我有一个非常标准的Qt GUI应用程序。它使用Qt的QSettings来存储许多设置,一切正常。

但是,当启动应用程序的多个副本,并且在一个或另一个中更改设置时,不同的副本可能看起来不一致(因为一个副本具有数据的“旧”副本)。

这个问题的首选解决方案是什么?我想这个问题就出现了,甚至在Qt竞技场之外。

2 个答案:

答案 0 :(得分:1)

QSettings文档在Accessing Settings from Multiple Threads or Processes Simultaneously部分提到了这一点:

  • QSettings可以安全地用于不同的进程(可以是同时运行的应用程序的不同实例或完全不同的应用程序)来读取和写入相同的系统位置。它使用建议文件锁定和智能合并算法来确保数据完整性。在调用sync()之前,其他进程执行的更改在当前进程中不可见。

您是否曾尝试在编写值后从编写器应用程序调用yoursettings.sync()并在阅读之前从阅读器应用程序调用?如果是这样,如果你的逻辑是正确的,这听起来像是一个Qt bug。

答案 1 :(得分:0)

我面临同样的问题。有QSettings::sync()函数,但它似乎取决于设置文件(INI,注册表等)的完整性,而不是使设置与应用程序的状态一致。通过这种一致性'我的意思是,例如,作为用户,我在设置对话框中更改字体大小值,我希望整个应用程序重新布局和重新绘制。这在应用程序的一个实例中很容易实现(使用信号槽,事件等)。但是,当我运行两个或更多应用程序时,其他实例不会获得字体大小设置已更改的信息,它们不会重新布局或重新绘制,以后使用从{{1初始化的新字体大小绘制任何窗口小部件时它变得与应用程序的其余部分不一致,并且布局可能会被破坏。

但是有一个解决方案。它需要添加另一个'缓存'所有设置的级别,高于QSettings。所有设置将仅在应用程序启动时使用QSettings加载到某些设置数据类,并且在应用程序运行期间,应用程序不会直接从QSettings::value(...)读取,而是仅从缓存中读取。这样,您将拥有完全一致的行为。当用户更改设置对话框中的某些设置时,每个项目将与缓存的值进行比较(即检查用户是否更改了它),如果不相等,则使用QSettings::value()将其写入设置。

QSettings::setValue()