QMap mit einer Liste von Zeigern

Alles rund um die Programmierung mit Qt
Antworten
marco
Beiträge: 41
Registriert: 6. Dezember 2006 23:46
Wohnort: Niederrhein

QMap mit einer Liste von Zeigern

Beitrag 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
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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.
marco
Beiträge: 41
Registriert: 6. Dezember 2006 23:46
Wohnort: Niederrhein

Beitrag 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... :-\
Antworten