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());

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

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" недостаточно хорошо, и вы должны использовать другие справочник.


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

#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");

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

Это все еще верно в Qt Creator 3.3.2 со следующим предостережением. Когда вы развертываете приложение на Android и посмотрите на окно вывода приложения, есть панель инструментов с кнопкой "стоп" (Красный квадрат) и "запустите кнопку Настройки запустить" (зеленый треугольник).

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

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

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


Привет, я нашел решение, протестированное на 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;

}

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


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

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

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