1

次のコードを使用して、構成ファイルにデータを書き込んでいます。

   QSettings settings("/root/configFile.ini",QSettings::IniFormat);

   QString userName = lineEditUsername.text();
   QString password = lineEditPassword.text();

   QList<QString> listUsername;
   QList<QString> listPassword;

   settings.beginWriteArray("UserData");

   for(i=0;i<listUsername.size();i++)
  {
      Qstring user = listUsername.at(i);         
      Qstring pass = listPassword.at(i);

      settings.setArryIndex(i);
      settings.setValue("Username",user);
      settings.setValue("Password",pass);
   }

  settings.endArray();
 }

コードを初めて実行して 4 つまたは 5 つの値を指定すると、それらはファイル内で適切な順序で形成されます。ただし、アプリケーションを 2 回目に実行すると、値は最初の位置から上書きされ始めます。誰かが私にこれに対する解決策を提案できますか?

4

2 に答える 2

3

配列とインデックスを作成して維持する代わりに、次のようにユーザー資格情報マップを作成して設定ファイルに保存することを提案します。

QSettings settings("/root/configFile.ini", QSettings::IniFormat);

QString userName = lineEditUsername.text();
QString password = lineEditPassword.text();

QList<QString> listUsername;
QList<QString> listPassword;

//settings.beginWriteArray("UserData");

QVariantMap userDataMapping;

for(int i = 0; i < listUsername.size() ; i++)
{
    QString user = listUsername.at(i);         
    QString pass = listPassword.at(i);

    userDataMapping[user] = pass;

    //settings.setArryIndex(i);
    //settings.setValue("Username",user);
    //settings.setValue("Password",pass);
}

// Store the mapping.
settings.setValue("UserData", userDataMapping);

//settings.endArray();
// ...

これにより、データが次の形式で ini ファイルに保存されます。

UserData=@Variant(\0\0\0\b\0\0\0\x1\0\0\0\x6\0\x64\0\x64\0\x64\0\0\0\n\0\0\0\x6\0\x62\0\x62\0\x62)

設定を読み取るときは、次のようにします。

[..]
QVariant v = settings.value("UserData");
QVariantMap map = v.value<QVariantMap>();
QMapIterator<QString, QVariant> i(map);
while (i.hasNext()) {
    i.next();
    QString user = i.key();
    QString pass = i.value().toString();
}
于 2013-09-20T14:00:26.563 に答える
0

新しいエントリを追加する前に、既存のエントリの量を取得する必要があります。このようなもの:

int size = settings.beginReadArray( "UserData" );
settings.endArray();

settings.beginWriteArray( "UserData" );
settings.setArrayIndex( size );  // Note: Maybe 'size - 1', not  sure

// ...
settings.endArray();

setArrayIndex( size )は配列インデックスを最後に移動するため、既存のエントリをオーバーライドしなくなります

于 2013-09-20T13:24:59.700 に答える