QSettings在MacOS上的怪异行为

时间:2018-09-12 15:49:33

标签: c++ macos qt qsettings

在MacOS 10.13.6上通过自制软件使用Qt 5.11.1,我在应用程序中使用了QSettings。这是我现在正在从Linux和Windows移植到MacOS的工作程序。

我在MacOS上遇到的问题是它将文件保存到本应保存的 /Users/michaelleonetti/Library/Preferences/com.sonarcloud.Sonarcloud Service.plist 中,在第一次执行程序时。

如果我有时删除文件 ,它将返回。 有时候不是。如果我使用Xcode编辑plist文件并保存,则在“ have”中编写的值将不存在。

我无法确定押韵或使其生效的原因。

我创建了一个最小的示例:

#include <QSettings>

#include <iostream>

int main( int argc, char *argv[] )
{

    { // Scope
        QSettings settings( QSettings::NativeFormat, QSettings::UserScope, "My Application Company", "My Application" );
        if( settings.contains( "have" ) )
            std::cout << "We have: " << settings.value( "have" ).toString().toStdString() << std::endl;
        else
            std::cout << "You do not have" << std::endl;

        settings.setValue( "version", 10 );
        std::cout << "Path is: " << settings.fileName().toStdString() << std::endl;
    }

    return( EXIT_SUCCESS );
}

输出:

$ ./src/reproduce
You do not have
Path is: /Users/michaelleonetti/Library/Preferences/com.my-application-company.My Application.plist

文件检查

$ cat "/Users/michaelleonetti/Library/Preferences/com.my-application-company.My Application.plist"
cat: /Users/michaelleonetti/Library/Preferences/com.my-application-company.My Application.plist: No such file or directory

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

认为这是由于QSettings被实施在Apple的CFPreferences数据库之上。这是预期的行为,“解决方案”是调用CFPreferencesSynchronize()

文档:

  

将对首选项数据的所有未决更改写入永久存储,   并从永久存储中读取最新的偏好数据

幸运的是,QT似乎将其包装在QSettings的{​​{3}}中,并且您应该能够以与平台无关的方式调用QSettings::sync()

基本上,您需要同步设置,然后才能看到外部写入的任何更改**。这也是为什么文件似乎不总是被重写的原因(当文件被自动刷新时,它应该在应用程序退出时退出)。

请注意,您还需要通过在外部应用程序中调用CFPreferencesSynchronize()来同步来自外部应用程序的设置,以查看您的QT应用程序所做的更改。

知道有一个名为defaults的命令行实用程序也可以很有趣,您可以使用该实用程序从shell脚本或终端执行同步写入。

**这自然会在某些时候自动发生。