QList / Qlistwidget synchron halten



  • Hallo alle zusammen,
    ich mache derzeit eine Projektarbeit für meine Hochschule dabei soll ich in QT ein Programm schreiben.(noch nie damit gearbeitet und nicht im Unterricht gehabt.)
    Derzeit habe ich nur die Grundkenntnisse der C++ Programmierung und versuche mich durch etliche Tutorials und der QT-Dokumentation um mein Projekt zu realisieren.
    Bisher hat alles geklappt nur ich hänge jetzt an einem Thema fest.

    Nämlich ich habe eine Klasse cEintrag die Personendaten speichert mit get und set methoden.
    Habe einen Dialog gemacht der mir ein Objekt mit diesen Daten speichert.
    Dieses lege ich in ein QList<cEintrag*> rein.

    Mein Plan ist es in dem mainwindow ein Qlistwidget einzusetzen wo meine nur der Name und der Vorname erscheint und durch Klicken auf den jeweiligen Namen die Daten in Textedits angezeigt werden.

    //Daten in Liste einsetzen
    void MainWindow::addElement(cEintrag *neuerKontakt)
    {
        liste.append(neuerKontakt);
        // Überprüfung in der Konsole ob Funktion ausgeführt wird
        qDebug()<<"Add Element hinzugefügt";
    
    }
    //Daten in die ListWidget einsetzen
    void MainWindow::addItemtoList(cEintrag *neuerKontakt){
        ui->listWidget->addItem(neuerKontakt->getName()+", "+neuerKontakt->getvName());
    
    }
    

    Als nächstes habe ich einen Slot erstellt wo ich ein Element aus der Liste auswähle und mir dann die Daten von dem Jeweiligen angeklickten Namen in die jeweiligen Textfelder angezeigt werden sollen!!!

    void MainWindow::on_listWidget_itemPressed(QListWidgetItem *item){
    
        ui->textEdit->setText(liste.at(ui->listWidget->currentRow())->getName());
        ui->textEdit_2->setText(liste.at(ui->listWidget->currentRow())->getvName());
        ui->textEdit_3->setText(liste.at(ui->listWidget->currentRow())->getAdresse());
        ui->textEdit_4->setText(liste.at(ui->listWidget->currentRow())->getTelPrivat());
        ui->textEdit_5->setText(liste.at(ui->listWidget->currentRow())->getTelArbeit());
        ui->textEdit_6->setText(liste.at(ui->listWidget->currentRow())->getFax());
        ui->textEdit_7->setText(liste.at(ui->listWidget->currentRow())->getEmail());
    
    }
    

    Das Sieht dann so aus:

    2_1514120692824_Screenshot 2017-12-24 14.04.34.png 1_1514120692823_Screenshot 2017-12-24 14.04.32.png 0_1514120692823_Screenshot 2017-12-24 14.04.30.png
    Wie ihr nun sehen könnt sind meine Listen nicht synchron von der Reihenfolge her, das liegt auch daran das ich das listwidget.sortigEnabled auf true hab.
    Lass ich das Sortieren raus dann funktioniert das mit der Reihenfolge da die Position in meiner Liste mit der Position des Listwidget ist.

    Habt ihr eine Idee wie ich die beiden Listen synchron halten kann.
    Oder gibt es eine Möglichkeit nur mit einer Liste zu arbeiten?

    Ich hoffe ich konnte mein Problem verständlich erklären.

    Falls ihr noch Rückfragen habt oder noch mehr Code braucht, dann stehe ich euch jederzeit zur Verfügung und Danke euch schon mal im Voraus.

    Liebe Grüße und Frohe Weihnachten


  • Qt Champions 2017

    Hi @harupis,

    Oder gibt es eine Möglichkeit nur mit einer Liste zu arbeiten?

    Ja, die gibt es, nennt sich Model-View und ist genau das was Du hier brauchst. Im Prinzip ist das ganze eine Sicht (ein Formular oder Dialog) auf eine Datenbasis (Datenbank, Textdatei, oder auch dynamische Prozessdaten).

    Eine Einführung dazu gibt es hier: http://doc.qt.io/qt-5/modelview.html

    Du würdest dann Dein ListWidget durch eine ListView ersetzen und müsstest ein wenig Code schreiben, um die ListView mit den gewünschten Daten zu füllen.

    Sieht am Anfang kompliziert aus, ist aber machbar. Es gibt einige Beispiele dazu im Netz.

    Der Vorteil ist, dass später der Dialog der die Daten anzeigt einfach durch andere Elemente ersetzt werden kann, während die Daten die gleichen bleiben.

    Frohe Weihnachten, und viel Erfolg.



  • Danke für die schnelle Rückmeldung habe es mir mal angschaut, aber mir wird hier nicht viel klar wie ich was machen soll.
    Natürlich interessiert mich das ModellView und werde das auch bischen nachverfolgen.
    Nur ich würd gerne eine lösung in dem ich nicht mein ganzes Programm neu schreiben muss.
    Gibt es vlt die Möglichkeit in Items ein Objekt zu hinterelegen? Wenn ja wie geht das genau?


  • Qt Champions 2017

    @harupis

    Na ja, das QListWidget ist intern auch ein QListView, nur das dort das Modell vordefiniert ist.

    Man kann das natürlich auch so verwenden, dass man jedem in der Liste sichtbaren Item noch extra Daten mit anhängt, siehe http://doc.qt.io/qt-5/qlistwidgetitem.html#data

    Das ist dann aber schon ziemlich wild zusammengehackt und vielleicht nicht der akademische Weg (könnte ja auf die Note Einfluss haben).

    Aber dazu müsstest Du uns vielleicht auch verraten, was das Lernziel bei dieser Projektarbeit sein soll. Ist es verbessern der C++-Fähigkeiten, Kennenlernen von Qt, oder vielleicht doch strukturiertes aufbewahren von Daten? Oder alles zusammen?



  • Ich studiere Mechatronik, das ist nicht eines meiner Hautpfächer, ich soll nur ein wenig das QT Framework kennenlernen.

    Bezüglich der SetData, diese Funktion hatte ich auch gesehen nur ich verstehe ihre Implementierung nicht.
    Ich wäre für jeden Rat dankbar.
    Gerade halte ich meine meine zwei listen mittels einer For schleife die die Namen vergleicht und somit die richtigen Daten ausspuckt.
    Aber das finde ich als noch ein größeren murks.

    Kannst du mir vllt ein Beispiel geben wie du es machen würdest?

    Liebe Grüße


  • Qt Champions 2017

    @harupis said in QList / Qlistwidget synchron halten:

    Kannst du mir vllt ein Beispiel geben wie du es machen würdest?

    Nein, aber Google bedienen. Eines der ersten Ergebnisse ist: https://stackoverflow.com/questions/7136818/can-i-store-some-user-data-in-every-item-of-a-qlistwidget

    Dort wird im Beispiel ein weiterer QString mit in der Liste abgelegt. Anstelle eines QString kann aber auch jedes andere Objekt (und damit auch eine Struktur mehrerer Objekte) abgelegt werden. Mehr sage ich dazu aber jetzt nicht, sonst ist die Hausaufgabe schon fertig gelöst.

    Hoffe trotzdem geholfen zu haben.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.