在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
如何解决此问题?
答案 0 :(得分:2)
我认为这是由于QSettings
被实施在Apple的CFPreferences
数据库之上。这是预期的行为,“解决方案”是调用CFPreferencesSynchronize()
文档:
将对首选项数据的所有未决更改写入永久存储, 并从永久存储中读取最新的偏好数据
幸运的是,QT似乎将其包装在QSettings
的{{3}}中,并且您应该能够以与平台无关的方式调用QSettings::sync()
。
基本上,您需要同步设置,然后才能看到外部写入的任何更改**。这也是为什么文件似乎不总是被重写的原因(当文件被自动刷新时,它应该在应用程序退出时退出)。
请注意,您还需要通过在外部应用程序中调用CFPreferencesSynchronize()
来同步来自外部应用程序的设置,以查看您的QT应用程序所做的更改。
知道有一个名为defaults
的命令行实用程序也可以很有趣,您可以使用该实用程序从shell脚本或终端执行同步写入。
**这自然会在某些时候自动发生。