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

C++ Qt-同一应用程序的多个副本打开&;设置同步,c++,qt,C++,Qt,我有一个非常标准的QtGUI应用程序。它使用Qt的QSettings来存储许多设置,并且一切正常 但是,当启动应用程序的多个副本,并且其中一个副本的设置发生更改时,不同的副本可能会出现不一致(因为其中一个副本具有数据的“旧”副本) 这个问题的首选解决方案是什么?我想,即使在Qt竞技场之外,也会出现这个问题。QSettings文档在部分中提到了这一点: QSettings可以从不同的进程(可以是同时运行的应用程序的不同实例,也可以是不同的应用程序)安全地用于读取和写入相同的系统位置。它使用建议文

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

但是,当启动应用程序的多个副本,并且其中一个副本的设置发生更改时,不同的副本可能会出现不一致(因为其中一个副本具有数据的“旧”副本)


这个问题的首选解决方案是什么?我想,即使在Qt竞技场之外,也会出现这个问题。

QSettings文档在部分中提到了这一点:

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

您是否尝试在写入值后从writer应用程序调用yoursettings.sync(),在读取值前从reader应用程序调用它们?如果是这样,并且您的逻辑是正确的,那么这听起来像是一个Qt错误。

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

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


请在这里发布一些代码,您是如何在源代码中定义QSettings类的。我认为设置一些IPC将信号传递给其他进程会更容易。
// To be created at application startup, just after
// QApplication::setApplication(), setOrganizationName() etc. is called.
// When the application is running, you only obtain cached values
// from the instance of Settings instead of querying QSettings.
class Settings
{
    Settings() { 
        m_x = QSettings().value("x", 0).toInt(); 
    }

    int x() const {
        return m_x;
    }

    void setX(int x) {
        if (x == m_x)
            return;
        m_x = x;
        QSettings().setValue("x", x);
    }

private:
    int m_x;
}