QList Attribute der Klasse suchen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Pauer
Beiträge: 9
Registriert: 7. Juli 2013 22:25

QList Attribute der Klasse suchen

Beitrag von Pauer »

Hallo zusammen,

ich versuche gerade mal wieder eine Übungsaufgabe zu machen und komme nicht klar.
Ziel ist eine Kontaktliste zu machen. Wobei die Aufgabe darauf abzielt, den Umgang mit QList zu erlernen bzw. zu verstehen.

Zunächst meine Kontakt.h:

Code: Alles auswählen

#ifndef KONTAKT_H
#define KONTAKT_H

#include <QString>

class Kontakt
{
    friend class KontaktListe;
public:
    Kontakt();
    QString toString();

private:
    int kategorie;
    QString vorName;
    QString nachName;
    QString strassenAdresse;
    int postleitzahl;
    QString ort;
    int telefonNummer;

};

#endif // KONTAKT_H
die Kontakt.cpp führe ich nicht auf, da diese soweit funktioniert. Mein Problem liegt eher bei der Erstellung einer Kontaktliste.

Die Kontaktliste.h sieht folgendermaßen aus:

Code: Alles auswählen

#ifndef KONTAKTLISTE_H
#define KONTAKTLISTE_H

#include <QStringList>

class Kontakt;

class KontaktListe
{
public:
    KontaktListe();
    void zufuegen(Kontakt k);
    void entfernen(Kontakt k);
    QStringList getTeleListe(int Kategorie);
    QStringList getMailListe(int Kategorie);
    QList<Kontakt> gesamtKontaktliste;
};

#endif // KONTAKTLISTE_H
die zugrhörige .cpp schaut folgerndermaßen aus:

Code: Alles auswählen

#include "kontaktliste.h"
#include "kontakt.h"
#include <QTextStream>
#include <QString>
#include <QMessageBox>
#include <QStringList>
#include <QDebug>
#include <iostream>
#include <QInputDialog>

using namespace std;

KontaktListe::KontaktListe()
{
}

void KontaktListe::zufuegen(Kontakt k)
{
    QString kontaktSpeichern = QString("Möchten Sie den Kontakt zufuegen?");
    int frage2;
    int antwort = QMessageBox::question(0, "Kontakt hinzufügen", kontaktSpeichern, QMessageBox::Yes | QMessageBox::No);

    if (antwort == QMessageBox::Yes)
       gesamtKontaktliste += k;

        QString Kontaktanzeige2 = QString ("Name: \t%1 \t%2"
                               "\n Strasse: \t%3"
                               "\n PLZ: \t%4\tOrt: \t%5"
                               "\n Tel.-Nr.: \t%6").arg(k.vorName).arg(k.nachName).arg(k.strassenAdresse)
                                                 .arg(k.postleitzahl).arg(k.ort).arg(k.telefonNummer);
        frage2 = QMessageBox::information(0, "Kontakt", Kontaktanzeige2,
                                      QMessageBox::Ok);

}

void KontaktListe::entfernen(Kontakt k)
{
    bool ok;
     QString suchKontakt = QInputDialog::getText(0, "Kontakt", "Nachname", QLineEdit::Normal, "Zu entfernender Kontakt", &ok);
    if (ok) {
            
            }
    }
}
das zufügen eines Kontaktes scheint zunächst zu funktionieren.
Allerdings ist mir nicht klar, was beim entfernen nach dem if (ok) kommt, wenn ich einen Kontakt auf der gesamtKontaktliste über das Klassenattribut des Nachnamen ("nachName") suchen möchte? Kann ich das überhaupt?
Über gesamtKontaktliste.indexOf(suchKontakt) funktioniert das nicht, da kommt eine Fehlermeldung (wenn ich diese posten soll, einfach Bescheid geben). Ist vermutlich dem geschuldet, dass in der Liste der Typ Kontakt gespeichert ist und in suchKontakt ein QString.
Weiterhin würde mich interessieren, unter was die Liste die Kontakte speichert? Werden die Kontakte unter dem Namen gespeichert, welche ich ihnen im main.cpp gebe, oder anders?

Wenn jemand auch eine ausführlichere Bechreibung von Qlist wüsste, wäre das auch nett, wo ich die finden kann, in den Büchern, welche ich habe wird das gar nicht bzw. nur kurz angesprochen.
Wenn noch irgendetwas gebraucht wird, poste ich das gerne.
Vielen Dank schonmal an alle, welche sich die Mühe machen mir zu helfen :D

Gruß
Patrick
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QList Attribute der Klasse suchen

Beitrag von veeman »

Docu
-> QList

Element Entfernen: removeAt/erase
Element Suchen: indexOf -> Vorausgesetzt es wurde der operator==() implementiert
Oder Durch die Liste iterieren und dann bei Fund das Element löschen.
Pauer
Beiträge: 9
Registriert: 7. Juli 2013 22:25

Re: QList Attribute der Klasse suchen

Beitrag von Pauer »

Danke veeman für deine Antwort.

Ich habe mich jetzt erstmal für das iterieren entschieden. demnach sieht das jetzt so aus:

Code: Alles auswählen

void KontaktListe::entfernen()
{
    bool ok;
     QString suchKontakt = QInputDialog::getText(0, "Kontakt", "Nachname", QLineEdit::Normal, "Zu entfernender Kontakt", &ok);
    if (ok) {
        int i, j = 0;
        for (i = 0; i <= 3; i++){
        if (gesamtKontaktliste[j].nachName == suchKontakt)
                    cout << "An Position " << j << " gefunden!!!" << endl;
        else
        cout << "no" << endl;
        j++;}
        }
Allerdings bekomme ich folgende Fehlermeldung und diese ist mir nicht klar:

Code: Alles auswählen

Starte D:\qt projekte\build-Kontaktliste-Desktop_Qt_5_2_1_MinGW_32bit-Debug\debug\Kontaktliste.exe...
no
no
An Position 2 gefunden!!!
ASSERT failure in QList<T>::operator[]: "index out of range", file C:\Qt\5.2.1\mingw48_32\include/QtCore/qlist.h, line 480
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
D:\qt projekte\build-Kontaktliste-Desktop_Qt_5_2_1_MinGW_32bit-Debug\debug\Kontaktliste.exe beendet, Rückgabewert 3
Ich bin für jede Hilfe sehr dankbar.

MfG
Patrick
dazedly
Beiträge: 197
Registriert: 3. Oktober 2010 15:38
Kontaktdaten:

Re: QList Attribute der Klasse suchen

Beitrag von dazedly »

Du greifst auf einen Key zu, den es nicht gibt, deswegen "Index out of range"

Du kannst auch mit foreach auf die Liste zugreifen.

Code: Alles auswählen

QList<Kontakt > kontakte;
foreach(Kontakt kontakt,kontakte )
{
    if(kontakt.nachname == suchKontakt)
         qDebug() << "Gefunden !";
}
Antworten