String Indizierter QVector, QList o.ä.



  • zwutz schrieb:

    falsch. QMap verlangt operator< . operator== wird von QHash vorausgesetzt 😉

    Stimmt, mist.
    Und ich hatte die Doku offen und den Satz genau vor meiner Nase 😃



  • Ja sorry, Hochkomma und semikolon. Bin halt noch bei PHP manchmal 😉

    Hab nicht wirklich drüber nachgedacht.

    Danke ich probiere es mal mit ner qmap.



  • Ok, das eine klappt schonmal!
    So hab nun dieses kleine Script geschrieben:

    QMap<QString, QMap<QString, QString> > test2darray;
    test2darray["Wert1"]["Value1"] = QString::fromStdString("test1");
    test2darray["Wert1"]["Value2"] = QString::fromStdString("test2");
    test2darray["Wert1"]["Value3"] = QString::fromStdString("test3");
    
    test2darray["Wert2"]["Value1"] = QString::fromStdString("bla1");
    test2darray["Wert2"]["Value2"] = QString::fromStdString("bla2");
    test2darray["Wert2"]["Value3"] = QString::fromStdString("bla3");
    

    Wenn ich nun diese Foreach-Schleife durchlaufen lasse geht es, mir werden die Werte test1-3 angezeigt:

    foreach(QString str, test2darray["Wert1"]) {
      qDebug() << str;
      }
    

    Aber wenn ich nun die Foreach-Schleife für's erste Paar ausgeben möchte klappt das leider noch nicht:

    foreach(QString str, test2darray) {
      qDebug() << str;
      }
    

    Da hätte ich jetzt gerne die Werte "Wert1" und "Wert2" ausgegeben. Dat klappt aber irgendwie nicht mit dem was ich da gemacht habe 😞

    Könnt Ihr mir da nochmal helfen?

    Als nächstes wäre noch die Frage wie ich bei der oberen Schleife noch den Key von dem aktuellen Wert bekommen kann. Also irgendwie sowas:

    foreach(QString str, test2darray["Wert1"]) {
      qDebug() << "Key: " << key << " mit dem Wert: " << str;
      }
    

    und als Ausgabe hätte ich dann:
    Key: Value1 mit dem Wert: test1
    Key: Value2 mit dem Wert: test2
    Key: Value3 mit dem Wert: test3

    Vielen dank euch allen!!



  • foreach ist da eher die schlechtere Wahl. Wenn du Zugriff auf die keys haben willst, musst du die iteratoren bemühen

    for (QMap<QString, QMap<QString, QString> >::iterator oiter = test2darray.begin(); oiter != test2darray.end(); ++oiter)
      {
        QString key1 = oiter.key();
        QMap<QString, QString> value1 = oiter.value();
    
        for (QMap<QString, QString>::iterator iiter = value1.begin(); iiter != value1.end(); ++iiter)
        {
          QString key2 = iiter.key();
          QString value2 = iiter.value();
    
          std::cout << "test2darray[\"" << key1 << "\"][\"" << key2 << "\"] = \"" << value2 << "\"" << std::endl;
        }
      }
    


  • QMap<QString, QMap<QString, QString> > test2darray;
    test2darray["Wert1"]["Value1"] = QString::fromStdString("test1");
    [...]
    

    Ist das dein Ernst?
    Du erstellst da erst einen std::string mit nem const char* als Parameter, nur um ihn dann über QString::fromStdString() in einen QString zu bekommen?
    Das sollte eigentlich auch so funktionieren:

    test2darray["Wert2"]["Value1"] = "bla1"
    

    Ansonsten gibt es auch für QString den Konstruktor mit const char* als Parameter, kein Grund also um den Umweg über std::string zu gehen!



  • QString den Konstruktor mit const char* als Parameter, kein Grund also um den Umweg über std::string zu gehen!

    bei mir meckert er immer! Und sagt das es ebend solch einen Konstruktor nicht gibt!



  • Ok, mit iteratoren geht es wunderbar! Vielen vielen Dank



  • der_burner schrieb:

    QString den Konstruktor mit const char* als Parameter, kein Grund also um den Umweg über std::string zu gehen!

    bei mir meckert er immer! Und sagt das es ebend solch einen Konstruktor nicht gibt!

    evtl irgendwo QT_NO_CAST_FROM_ASCII definiert?

    Dann würde ich aber QString::fromAscii(const char*) verwenden.



  • Jup, das wars! War in der .pro Datei definiert. Habs rausgeschmissen und schon läufts.

    Vielen Dank



  • zwutz schrieb:

    Dann würde ich aber QString::fromAscii(const char*) verwenden.

    Ich denke QString::fromLocal8Bit() ist besser. Das verwendet die locale. Latin-1 ist ja nicht unbedingt überall das Nonplusultra...


Anmelden zum Antworten