7

我想在运行在 Android 上的 qt 应用程序中保存一些用户凭据。我像这样使用 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 上运行。
谢谢

4

6 回答 6

6

我也遇到了类似的问题,发现应该做两件事:

  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”还不够好,您应该使用其他目录。

于 2013-10-16T12:14:29.547 回答
2

您可以尝试将设置文件的位置指定为即使删除应用程序也存在的可写位置:

#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");
于 2014-08-01T18:03:29.140 回答
1

嗨,我找到了解决方案,在 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;

}

希望这可以帮助,

于 2018-02-03T20:51:40.493 回答
1

如前所述,从 Qt Creator 重新部署应用程序会擦除设置。

这在 Qt Creator 3.3.2 中仍然适用,但有以下警告。当您在 Android 上部署应用程序并查看“应用程序输出”窗口时,会出现一个带有“停止”按钮(红色方块)和“重新运行此运行配置”按钮(绿色三角形)的工具栏。

来自 Qt 的初始部署会启动应用程序。QSettings 对象被清除或为空。对 QSettings 对象的任何更改都将保存在该对象中。

如果您使用红色按钮停止应用程序,然后立即使用绿色重新运行按钮重新启动应用程序,应用程序将重新启动,并且之前运行中对 QSettings 对象的所有更改仍将存在。

我假设这模拟了设备上应用程序的启动、退出、重新启动。

于 2015-07-22T22:06:02.910 回答
0

I had a problem similar to the above, and it turned out that everything worked just fine. That is it did work with a simple QSettings object without any arguments.

HOWEVER, every time I re-deployed the application from Qt Creator, the settings file was destroyed, leading me to the conclusion that QSettings did not work.

The problem should, according to Bogdan himself, have been fixed in Qt Creator 3.2

于 2014-04-04T07:03:21.930 回答
0

您的代码的唯一问题是,对于 Android,您必须使用QStandartPaths来获取路径而不是QCoreApplication::applicationDirPath().

QCoreApplication::applicationDirPath()将为您提供 Android 应用程序的 Windows 应用程序路径,该路径不适用于 Android。

于 2021-11-25T06:02:55.227 回答