Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Andere GUIs - Qt, GTK+, wxWidgets ::  QT Anwendung 2D Array     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
tianstar
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.11.2017
Beiträge: 3
Beitrag tianstar Mitglied 17:29:51 13.11.2017   Titel:   QT Anwendung 2D Array            Zitieren

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 ?

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 :(
Skylac06
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.02.2017
Beiträge: 90
Beitrag Skylac06 Mitglied 18:15:58 13.11.2017   Titel:              Zitieren

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.
tianstar
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.11.2017
Beiträge: 3
Beitrag tianstar Mitglied 18:30:44 13.11.2017   Titel:              Zitieren

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 :D

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

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 4142
Beitrag Mechanics Mitglied 20:08:05 13.11.2017   Titel:              Zitieren

Überleg mal, was dabei rauskommt:

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

Benutzerprofil
Anmeldungsdatum: 13.02.2017
Beiträge: 90
Beitrag Skylac06 Mitglied 21:09:48 13.11.2017   Titel:              Zitieren

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.
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 4142
Beitrag Mechanics Mitglied 23:25:29 13.11.2017   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 13.02.2017
Beiträge: 90
Beitrag Skylac06 Mitglied 07:12:56 14.11.2017   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 13.11.2017
Beiträge: 3
Beitrag tianstar Mitglied 07:54:59 14.11.2017   Titel:              Zitieren

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.
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 4142
Beitrag Mechanics Mitglied 21:08:10 14.11.2017   Titel:              Zitieren

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.
C++ Forum :: Andere GUIs - Qt, GTK+, wxWidgets ::  QT Anwendung 2D Array   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.