Seite 1 von 1

QMap mit einer Liste von Zeigern

Verfasst: 10. Dezember 2006 20:58
von marco
Hallo,

erstemal ein wenig Code:

Code: Alles auswählen

class TClass : public QObject {
//...
private:
QMap<QString, QLineEdit*> map;
//...
};
also mein Ziel ist es, eine Liste von Zeigern auf QLineEdit-Widgets zu pflegen, die durch QString-Objekte indiziert werden. Dazu bemühe ich als reiner C-Programmierer nun das erste mal ein Klassentemplate (QMap).

Code: Alles auswählen

void TClass::ConnectQLineEdit(QLineEdit *a_line_edit, QString a_field_name) {

  map.insert(a_field_name, a_line_edit);
  connect(a_line_edit, SIGNAL(textEdited(const QString&)), this, SLOT(Modify()));

}
Das ist meine "insert"-Methode. Und so versuch ich nun alle Zeiger zu durchlaufen:

Code: Alles auswählen

QMapIterator<QString, QLineEdit*> le(map);
  while (le.hasNext()) {
    QLineEdit *tmp = (QLineEdit*)le.value();
    //mache irgendwas mit tmp->setText(..) z.b.
    le.next();
  }
Lässt sich auch prima kompillieren, allerdings bricht mein Programm leider beim Aufruf mit der Meldung "ASSERT: "item_exists()" in file /usr/include/qt4/QtCore/qmap.h, line 854"

Ich frage mich, was hier schief läuft.

Fahre ich mit QMap und der Verwaltung einer Zeigerliste auf Widget-Objekte überhaupt auf dem richtigen Dampfer? Vielleicht kann mir jemand ein Beispiel zeigen, wie man sowas mit Qt elegant bewerkstelligen kann?

Vielen Dank schonmal und noch einen schönen 2. Advent!
Marco

Verfasst: 10. Dezember 2006 21:10
von BartSimpson
ich würde eventuell besser QHash nehmen, denn das ist schneller.
deine while Konstruktion würde ich durch Q_FOREACH ersetzen.
Der Fehler besagt, das es schon ein Zeiger mit dem Namen gibt.
Sprich, du versucht mehr als einmal den gleiche Namen für den Zeiger zu nutzen.

Verfasst: 10. Dezember 2006 23:18
von marco
Danke für den Tipp mit dem Hash.
Bei genauerer Betrachtung muss es natürlich

Code: Alles auswählen

QMapIterator<QString, QLineEdit*> le(map); 
  while (le.hasNext()) { 
    le.next(); 
    QLineEdit *tmp = (QLineEdit*)le.value(); 
    //mache irgendwas mit tmp->setText(..) z.b. 
  }
sein, dann klappt es logischerweise auch... :-\