【问题标题】:QSettings is not working proprely on Qt under AndroidQSettings 在 Android 下的 Qt 上无法正常工作
【发布时间】:2013-10-22 11:54:10
【问题描述】:

我想在我在 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 上运行。
谢谢

【问题讨论】:

  • 该路径在包括 Android 在内的大多数平台上都不可写。您是否尝试过使用默认构造(无参数)的 QSettings 对象?
  • 我按照你说的尝试了 QSettings("test") ,但响应相同,用户名和密码的值无效。也许值得一提的是,我的 AndroidManifest.xml 设置包含 "...user-permission 。 ..WRITE_EXTERNAL_STORAGE"..这是我对这个问题的唯一提示,但它已设置但仍无法正常工作。谢谢
  • 我认为,部署包括设置文件并使用该文件会有所帮助。或者使用 QSettings::IniFormat,并将文件放在 /sdcard/.settings 或 /mnt/card0。使用一些预定义的路径。
  • QSettings(test) 也从工作目录构造一个路径。尝试一个默认构造的,即new QSettings()
  • 我试过 QSettings() 没有成功。将其保存在“/sdcard ...”上有效。奇怪的事实,因为我没有 SD 卡,我有一个 Nexus 手机。谢谢你的回答。

标签: android qt qsettings


【解决方案1】:

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

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

【讨论】:

    【解决方案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");
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        }

        希望对你有帮助,

        【讨论】:

          【解决方案5】:

          我遇到了与上述类似的问题,结果一切正常。也就是说,它确实适用于没有任何参数的简单 QSettings 对象。

          但是,每次我从 Qt Creator 重新部署应用程序时,设置文件都会被破坏,导致我得出 QSettings 不起作用的结论。

          根据 Bogdan 本人的说法,该问题应该已在 Qt Creator 3.2 中得到修复

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 2015-12-25
              • 2016-08-16
              • 2022-08-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多