Ausgabe von Variablen aus Instanzen mittels QList
-
Hallo zusammen
Ich möchte mehrere Instanzen einer Klasse in einer QList speichern. Meine Klasse sieht zunächst so aus:
class Produkt { public: void Produkt::Herstellung(long int Zeit_Herstellung)//die Zeit wird mittels Zeitstempel ermittelt und in Sekunden angegeben { Herstellungszeit = Zeit_Herstellung; } void Auslieferung(long int Zeit_Auslieferung) { Liegezeit = Zeit_Auslieferung - Zeit_Herstellung; } };
So schaffe ich Instanzen und speichere diese in einer QList:
Produkt* neues_Produkt = new Produkt();// Die Klasse Produkt QList<Produkt*> meineListe;// Die QList mit dem Typ Produkt QList<Produkt*>::iterator Iter; // Iterator definieren for(int i=0; i<4; i++) { time_t now; //Zeitstempel time(&now); Produkt* neuer_Produkt = new Produkt();// Instanzierung Sleep(1000); //Hier soll eine Pause von 1 Sekunde entstehen! neues_Produkt->Herstellung(now);//Hier schreibe ich den Zeitstempel rein meineListe.push_back(neues_Produkt);// Die Instanzen werden in die Liste eingeschoben }
Nun zu meinem Problem: Ich möchte z.B. in einem Label den Inhalt der Liste ausgeben. Ich weiß nicht, wie ich z.B. auf das 2. Element(Instanz) in der QList zugreife und z.B. die Herstellungszeit abfrage (oder neu belege).
Mit meinem Ansatz komme ich leider auch nicht weiter:
long int a; a= meineListe[1]->Wartezeit_neu(); ui->label_2->setText(QString().setNum(a));
Zum Hintergrund: Ich arbeite mit QT 5.0.1 und nutze die Doku http://qt-project.org/
Ich hoffe, dass ich es verständlich formuliert habe. Danke für eure Hilfe!
Viele Grüße, marcel87
-
Eigentlich solltest du dafür in Qt ein Model verwenden.
Und wieso speicherst du pointer in der Liste? Du handelst dir da ne Menge Potentieller Speicherlöcher ein.
Und statt long int könntest in Qt QDateTime nutzen, damit wäre das Handling für dich auch einfacher...
-
Brauchst du wirklich den Iterator? Sieht hier nicht so aus. QList hat eigentlich sehr verstaendlich benannte und nuetzliche Funktionen, die du dir vielleicht anschauen solltest:
at() - statt des []; ist schneller und macht (nahezu) keinen Unterschied, wenn du eh Pointer speicherstcount() - sagt, wie lang die Liste ist; extrem nuetlich in for-Schleifen
append() - ein Objekt hinten an die Liste haengen
prepend() - ein Objekt vorn an die Liste haengen.
time_t und die Sleep()-Funktion, die du benutzt, besitzen auch Qt-Aequivalente (QDateTime und vielleicht QThread::currentThread()->sleep()?). Der fuer mich groesste Vorteil von Qt ist, dass es unter nahezu jedem System laeuft - diese Eigenschaft muss man nicht mit Gewalt kaputt machen.
Und zum Problem: Zugreifen per at(), "WarteZeit_Neu()" hast du nirgendwo definiert.
Uebrigens ist ein direktes Zugreifen ("[1]") gefaehrlich. QList hat keine Sicherheitsvorkehrungen eingebaut, wenn ein ungueltiger Index angesprochen wird. Da stuerzt das Programm direkt ab.
Vielleicht musst du ein paar mehr Informationen preisgeben, ich sehe dein Problem noch nicht wirklich.
-
Hallo,
danke für eure AntwortenIch habe mir nochmal Zeit genommen und habe nun die Klasse neu erstellt, also mein Projekt modular aufgebaut. Anschließend habe ich in der header-Datei meine Produkteigenschaften bzw. deren Variablen unter public gesetzt und die benötigten Funktionen geschrieben.
#ifndef PRODUKT_H #define PRODUKT_H class Produkt { public: Produkt(){ Zeit_Kunde_Angabe = 0; Zeitangabe = 0; } void Produkt::Herstellzeit_alt(long int Zeit_alt); void Produkt::Herstellzeit_neu(long int Zeit_neu); int Zeitangabe; long int Zeit_Produkt_Angabe; }; #endif // PRODUKT_H
Die Instanzierung bleibt ja die gleiche, deswegen zeige ich euch nur den wichtigen Teil der produkt.cpp
#include "produkt.h" void Produkt::Herstellzeit_alt(long int Zeit_alt) { Zeit_Produkt_Angabe = Zeit_alt; } void Produkt::Herstellzeit_neu(long int Zeit_neu) { Zeitangabe = Zeit_neu - Zeit_Produkt_Angabe; }
Ich weiß natürlich auch Bescheid über das Übel mit dem Iterator und werde es berücksichtigen.
Danke nochmals