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


  • Mod

    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 speicherst

    count() - 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 Antworten 😉

    Ich 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 😉


Log in to reply