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 вещи:
- путь к файлу настроек должен быть указан
- 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