QSettings не работает должным образом на Qt под Android

Я хочу сохранить некоторые учетные данные пользователя в своем приложении qt, работающем на Android. Я использую QSettings для этого так:

QString appPath = QCoreApplication::applicationDirPath()+QLatin1Char('/');
set = new QSettings(appPath+"test",
                   QSettings::NativeFormat);
set->setValue ( "user/username", "NameOfTheUser" );
set->setValue ( "user/password", "UserPassword" );
set->sync();

Я перезапускаю приложение и внутри метода initialize() у меня есть:

QString username(set->value("user/username",
                                           ( QVariant ) tr ( "defaultUser" ) ).toString());
QString password(set->value("user/password",
                                           ( QVariant ) tr ( "defaultPass" ) ).toString());

Переменные имени пользователя и пароля не считываются из QSettings.
Тот же код работает в Windows.
Спасибо


person Lucian    schedule 14.10.2013    source источник
comment
Этот путь не будет доступен для записи на большинстве платформ, включая Android. Вы пытались использовать созданный по умолчанию (без аргументов) объект QSettings?   -  person Frank Osterfeld    schedule 15.10.2013
comment
Я попробовал, как вы сказали, вместо этого QSettings (тест), тот же ответ, недопустимые значения для имени пользователя и пароля. Возможно, стоит упомянуть, что мои настройки AndroidManifest.xml содержат ... разрешение пользователя ... WRITE_EXTERNAL_STORAGE ... это был мой единственный намек на эта проблема, но он установлен и все еще не работает. Спасибо   -  person Lucian    schedule 15.10.2013
comment
Я думаю, что развертывание файла настроек и использование этого файла поможет. Или используйте QSettings::IniFormat и поместите файл в /sdcard/.settings или /mnt/card0. Используйте некоторые предопределенные пути.   -  person Md. Minhazul Haque    schedule 15.10.2013
comment
QSettings(test) также создает путь из рабочего каталога. Попробуйте построенный по умолчанию, то есть new QSettings()   -  person Frank Osterfeld    schedule 15.10.2013
comment
Я пробовал QSettings() безуспешно. Сохранение на /sdcard... сработало. Странный факт, потому что у меня нет SD-карты, у меня телефон Nexus. Спасибо за ответ.   -  person Lucian    schedule 15.10.2013


Ответы (5)


Я также столкнулся с подобной проблемой и обнаружил, что нужно сделать 2 вещи:

  1. необходимо указать путь к файлу настроек
  2. QSettings::sync() следует явно вызывать после каждого изменения настроек.

Итак, в Windows у меня это работало:

QSettings settings("settings.ini", QSettings::IniFormat);
settings.setValue(GRID_ENABLED, enabled);

На Android я должен использовать следующий код:

QSettings settings("/sdcard/settings.ini", QSettings::NativeFormat); //can be IniFormat, no difference
settings.setValue(GRID_ENABLED, enabled);
settings.sync();

Вероятно, использование «sdcard» недостаточно хорошо, и вам следует использовать другой каталог.

person Volodymyr K.    schedule 16.10.2013

Вы можете попытаться указать расположение файла настроек в доступном для записи месте, которое существует, даже если приложение удалено:

#include <QSettings>
#include <QStandardPaths>

QString path ;
QString filename;

path = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) ;
filename = “config.ini” ;
QSettings settings(path + “/”+ filename,QSettings::IniFormat) ;

Здесь QStandardPaths::GenericDataLocation возвращает расположение каталога, в котором могут храниться постоянные данные, совместно используемые приложениями, и он никогда не бывает пустым.

Также вы можете установить имя приложения и организации в главном приложении один раз:

qApp->setOrganizationName("Company");
qApp->setApplicationName("App");
person Nejat    schedule 01.08.2014

Как уже отмечалось, повторное развертывание приложения из Qt Creator стирает настройки.

Это все еще верно в Qt Creator 3.3.2 со следующей оговоркой. Когда вы развертываете приложение на Android и смотрите в окно вывода приложения, вы видите панель инструментов с кнопкой «Стоп» (красный квадрат) и кнопкой «Повторно запустить эту конфигурацию запуска» (зеленый треугольник).

Первоначальное развертывание из Qt запускает приложение. Объект QSettings очищен или пуст. Любые изменения объекта QSettings будут сохранены в объекте.

Если вы остановите приложение с помощью красной кнопки, а затем немедленно перезапустите приложение с помощью зеленой кнопки «Повторно запустить», приложение перезапустится, и все изменения в объекте QSettings при предыдущем запуске останутся в силе.

Я предполагаю, что это эмулирует запуск, выход, перезапуск приложения на устройстве.

person L Clague    schedule 22.07.2015

Привет, я нашел решение, проверенное на 3 разных устройствах Android. Вы можете указать следующий путь для своих настроек.

mPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
QString filename = "se.ini";
mPath = mPath + "/" + filename;

Следуя коду, вы сохраняете свою информацию в указанном выше месте.

void ProfileManager::saveToRegistery()
{
    QSettings settings(mPath , QSettings::NativeFormat);
    settings.setValue("SE/Mail" , mMail);
    settings.setValue("SE/Pass" , mPass);

    settings.sync();
}

Если у вас возникли проблемы с сохранением этого места, вы запрашиваете у пользователя разрешение на доступ к любому файлу с помощью:

bool QAndroidPermissions::requestPermissions()
{

    QtAndroid::PermissionResult r = 
    QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
    if(r == QtAndroid::PermissionResult::Denied) {
    QtAndroid::requestPermissionsSync( QStringList() << 
     "android.permission.WRITE_EXTERNAL_STORAGE" );
    r =QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
    if(r == QtAndroid::PermissionResult::Denied) {
        return false;
    }
}
return true;

}

Надеюсь это поможет,

person john whitegun    schedule 03.02.2018

У меня была проблема, похожая на вышеописанную, и оказалось, что все работает просто отлично. То есть он работал с простым объектом QSettings без каких-либо аргументов.

ОДНАКО, каждый раз, когда я повторно развертывал приложение из Qt Creator, файл настроек уничтожался, что приводило меня к выводу, что QSettings не работает.

Проблема должна была, по словам самого Богдана, быть исправлена ​​в Qt Creator 3.2.

person Jesper K. Pedersen    schedule 04.04.2014