QSetting string liste

Alles rund um die Programmierung mit Qt
Antworten
auser
Beiträge: 3
Registriert: 22. Juni 2012 12:50

QSetting string liste

Beitrag von auser »

Hallo,

Folgendes Problemchen: Wenn man mit QSetting eine liszte in der Registry speicher und das erste element ein leeerer string ist wird aus dem vorher schön editierbaren REG_MULTI_SZ ein REG_BINARY der dann natürlich nicht mehr editierbar ist.

Das ist ein komisches Verhalten - evtl. ein Bug?

Kenn jemand dies Phänomen und evtl. ein workaround?

-> Ich benötige editierbare reg. entries!

Hier ein kleiner code schnippsel

Code: Alles auswählen

#include <QCoreApplication>
#include <QSettings>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  QSettings settings("MySoft", "Star Runner");

  const QString first_key( "/test_key_one");

  QVariantList first_list;
  //QString first_entry("one"); // wird als lesbarer REG_MULTI_SZ registry eintrag erzeugt
  QString first_entry("");      // wird als nicht lesbarer REG_BINARY registry eintrag erzeugt
  first_list.push_back( first_entry );
  first_list.push_back( "two" );
  first_list.push_back( "three" );
  settings.setValue( first_key, first_list );

  settings.sync();

  return a.exec();
}
Grüsse Gerd
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QSetting string liste

Beitrag von veeman »

Ist anscheinend so gewohlt:

Code: Alles auswählen

 case QVariant::List:
        case QVariant::StringList: {
            // If none of the elements contains '\0', we can use REG_MULTI_SZ, the
            // native registry string list type. Otherwise we use REG_BINARY.
            type = REG_MULTI_SZ;
            QStringList l = variantListToStringList(value.toList());
            QStringList::const_iterator it = l.constBegin();
            for (; it != l.constEnd(); ++it) {
                if ((*it).length() == 0 || stringContainsNullChar(*it)) {
                    type = REG_BINARY;
                    break;
                }
            }
Leerzeilen und Nullzeichen sind nicht erlaubt.
Als workaround einfach ein leerzeichen in die Zeile einfuegen.
auser
Beiträge: 3
Registriert: 22. Juni 2012 12:50

Re: QSetting string liste

Beitrag von auser »

Hallo veeman,

Schön das doch noch jemand geantwortet hat!

Und schade das dieses unsinnige Verhalten gewollt ist.

Ich verstehe leider nicht was was du meinst: Hasst du dich vielleicht verschrieben und "Als workaround einfach kein leerzeichen in die Zeile einfuegen." gemeint?

Kannst du nochmal gen auer erleutern was für ein workaround du meintest?

Ein trivialer workaround wäre das leerzeichen mit einem
QString substitut = "blabla"
ersetzen und dann beim einlesen "blabla" wider mit dem leerzeichen zu ersetzen.
Das finde ich aber relativ Aufwendig und fedhleranfällig ;)
Es wäre schön wenn es eine einfachere Lösung geben würde.

Leider werden unsichtbare control codes wie \0x1A ignoriert
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QSetting string liste

Beitrag von RHBaum »

"Als workaround einfach kein leerzeichen in die Zeile einfuegen." gemeint?
Naja, du speicherst eine Liste mit strings als Teil einer Config ... ok
Nen "Leerstring" bedeuted eigentlich, nen nicht vorhandener, bzw ungültiger String.

Die Frage ist, was für eine Bedeutung hat ein Leerstring in einer Liste von strings. ???
Bissi restriktiver denkend würde man sagen, der hat in ner Stringliste nix zu suchen, oder die Stringliste transportiert mehr Informationen als sie eigentlich sollte ....

Also, warum brauchst du einen leerstring in der Liste, bzw was passiert, wenn du den vorher rausfilterst ....
In dem moment wo du sagst, naja dann komst mit der Posi durecheinander ... solltest vielleicht noch mal dein Datenkonzept überdenken ^^

Also was genau willst du speichern in der Reg/ini ... vielleicht koennen wir da mehr weiterhelfen ?

Ciao ...
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QSetting string liste

Beitrag von veeman »

veeman hat geschrieben:Als workaround einfach ein leerzeichen in die Zeile einfuegen.
Das ist schon so gemeint wie es da steht. -> Leerzeichen

Code: Alles auswählen

QString first_entry("");
// vs.
QString first_entry(" ");
// beim auslesen ggf mit trim wieder entfernen
Ansonsten den RHBaum's Ratschlag beherzigen.
Antworten