QSettings странное поведение на MacOS - PullRequest
0 голосов
/ 12 сентября 2018

Используя Qt 5.11.1 через homebrew на MacOS 10.13.6, я использую QSettings в своем приложении. Это рабочая программа, которую я сейчас портирую с Linux и Windows на MacOS.

Проблема, с которой я сталкиваюсь в MacOS, заключается в том, что он сохраняет файл в / Users / michaelleonetti / Library / Preferences / com.sonarcloud.Sonarcloud Service.plist , который должен первое выполнение программы.

Если я удаляю файл , иногда он возвращается. Иногда это не так. Если я отредактирую файл plist с помощью Xcode и сохраню его, значений, которые я напишу в "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 голосов
/ 12 сентября 2018

I думаю это связано с тем, что QSettings реализован поверх базы данных CFPreferences Apple.Это ожидаемое поведение, и «исправление» заключается в вызове CFPreferencesSynchronize ()

Документы:

записывает все ожидающие изменения в данные предпочтений в постоянное хранилище, ичитает последние данные о предпочтениях из постоянного хранилища

К счастью, кажется, что QT включает это в свою реализацию Mac для QSettings, и вы должны быть в состоянии вызвать QSettings::sync(), чтобы сделать этонезависимым от платформы способом.

В основном вам нужно синхронизировать настройки, прежде чем вы увидите какие-либо изменения от внешних записей **.Это также объясняет, почему файл не всегда перезаписывается (он должен выходить из приложения при автоматическом сбросе).

Обратите внимание, что вам также потребуется синхронизировать настройки из внешнего приложения, вызвав CFPreferencesSynchronize() внутри этого приложения, чтобы увидеть изменения, внесенные вашим приложением QT.

Также может быть интересно узнать, что есть утилита командной строки, которая называется defaults, которую вы можете использовать для выполнения синхронизированных записей изсценарий оболочки или терминал.

** Это происходит естественным образом в определенных точках автоматически.

...