QT Anwendung 2D Array



  • Hey Leute,

    ich bin sehr neu im Thema Programmierung. Ich habe bereits in das QT Forum geschrieben, jedoch scheint dieses nicht gut besucht zu sein. Ich will eine GUI schreiben, welche zum einen Möglichkeiten der Änderung des Spiels anbietet und zum anderen eben das Spielfeld visualisiert. Das Spiel habe ich soweit eigentlich fertig geschrieben, das mit Buttons und Co zu verknüpfen kriege ich denke ich auch so hin. Das Spielfeld an sich bereitet mir leider einiges Kopfzerbrechen und ich finde nicht wirklich einen passenden Rat.

    Der Spieler des Spiels legt so oft er will selber fest wie groß das Feld ist.
    Dh. 30*30 40*40 oder 50*50..
    Gespeichert habe ich alles in einem integer Array, nun gilt es dieses auf die GUI zu kriegen. Sinnvoll würde es eigentlich sein, wenn ich ein Grid Layout verwende und je nach Eingabe des Users verändere wie viele QLabel ich anordne.

    Leider programmiere ich noch nicht mal eine Woche, was mein Verständnis sehr einschränkt. Habt ihr eine Lösung ? Ein Code Beispiel ?

    void MainWindow ::changeSize(int index){
    
        QLabel *labels[index*index];
    
        for(int i = 0; i< (index*index); i++){
            labels[i] = new QLabel();
        }
    
        for(int i = 0; i< (index*index); i++){
            labels[i]->setText( "1" );
        }
    
        for(int i = 0; i< (index*index); i++){
            ui->spielbrett->addWidget(labels[i],i/(index*index),i%(index*index));
        }
    
    }
    

    Wenn ich das ausführe auf meinem MainWindow kommt zwar kein Fehler, aber es ändert sich auch überhaupt nichts 😞



  • Das Qt-Forum ist im Bereich von GUIs vermutlich deutlich besser besucht als dieses Forum hier. Nur wenn du im deutschsprachigen Unterforum geschrieben hast, kann es sein, dass dir da kaum jemand antworten wird.

    Mein Tipp an dich ist an dieser Stelle: fange noch nicht mit Qt an. Beschäftige dich erst mit reinem Standard-C++ und lerne dort die Möglichkeiten der Sprache kennen. Beschränke dich für den Anfang auf Konsolenprogramme.
    Wenn dir das Verständnis fehlt, bringen dir Code-Beispiele oder gar Lösungen überhaupt nichts. C++ kann man nicht innerhalb von wenigen Tagen lernen, egal was manche Bücher versprechen. Suche dir daher ein gutes C++-Buch und arbeite dies durch. Wenn du die grundlegenden Konzepte verstanden hast, kannst du mit anderen Frameworks und Libraries weitermachen. Dort fängst du dann im Optimalfall an, die Dokumentation durchzulesen. Gerade für Qt gibt es sehr gute Ausführungen, die auch für Anfänger verständlich sind - unter der Voraussetzung, dass die C++-Grundlagen sitzen.



  • Ich habe leider keine Wahl und werde das Problem so oder so lösen müssen :).
    Codebeispiele bringen mich denke ich sehr wohl sehr viel weiter 😃

    Ich probier es später mal im anderem Forum, danke für den Tipp !



  • Überleg mal, was dabei rauskommt:

    i/(index*index),i%(index*index)



  • Ich will dir nur sagen, dass, wenn du das ernsthaft für dich auch lernen willst, wirst du um die Grundlagen nicht herumkommen.

    Zu deinem Code:
    Warum verwendest du ein Array? In C++ nimmt man dafür einen std::vector. Wenn du mit Qt arbeitest, bietet sich sonst auch ein QVector an, ist Geschmackssache.
    Dann: warum durchläufst du dreimal direkt hintereinander dein Array? Da reicht auch einmal. In einem Schleifendurchlauf kannst du das alles hintereinander machen.
    Außerdem: Du erstellst damit, ob du willst oder nicht, memory leaks. Du legst auf dem Stack (lokal) Pointer an und weist diesen mithilfe von new Speicher zu. Diese Pointer werden aber am Ende der Funktion gelöscht. Was passiert mit dem Speicher? Wie willst du den wiederfinden?
    Wenn du nicht genau weißt, wie new funktioniert, versuche es nicht zu verwenden. Es ist nur selten wirklich notwendig. Hier im Falle von Qt hast du aber verschiedene Möglichkeiten:
    Einmal kannst du deinen QLabels ein parent zuweisen, das dann die Speicherfreigabe erledigt. Das machst du über den ctor, also in deinem Fall: new QLabel(this);
    Oder, die vermutlich bessere Lösung in deinem Fall: Lege den std::vector/QVector als Membervariable in MainWindow an.

    Dann solltest du dir noch Mechanics Kommentar ansehen.



  • Nein, das ist vermutlich kein Memleak. layout->addWidget setzt den Parent, wenn das Widget noch keinen Parent hat.



  • Entschuldigung, tatsächlich mein Fehler.
    Danke für die Berichtigung.



  • Mechanics schrieb:

    Überleg mal, was dabei rauskommt:

    i/(index*index),i%(index*index)

    Das muss natürlich (index) heißen.

    Ich schau mir gleich den QVector mal an, habe bis dato noch nie diesen Namen auch nur gehört oder gelesen. Den kann ich über ein Gridlayout verteilen ?
    Eine andere Alternative die mir Gestern noch über den Weg gelaufen ist, wäre eine QList <QLabels *> zu bauen?

    Habe auch in meinem C++ Buch nachgeschaut, leider werden da diese Datenstrukturen gar nicht behandelt.



  • tianstar schrieb:

    Habe auch in meinem C++ Buch nachgeschaut, leider werden da diese Datenstrukturen gar nicht behandelt.

    Naja, weil das Qt Datenstrukturen sind. Ich muss auch sagen, ich bevorzuge normalerweise die std Datenstrukturen. Qt hat viel selber gemacht, und nicht viel davon ist gut. Aber wenn man das schon für die GUI benutzt, ist es einfacher, mit deren Containern zu arbeiten. So lang du nicht hochkomplexe oder hochperformante Anwendungen schreiben willst, wirst du damit sicher auch keine Probleme haben.

    QVector entspricht mehr oder weniger einem std::vector, die QList ist eine Mischung aus std::vector und std::list. Für Zeigertypen wär die QList schon in Ordnung. Qt verwendet die QList halt viel häufiger als QVector, und das war auch keine gute Entscheidung.


Anmelden zum Antworten