Seite 1 von 1

QGridLayout spinnt!

Verfasst: 8. Dezember 2008 17:28
von Gapa
Hallo @Everyone!

Ich bin gerade dabei, unser Wahlsystem zu automatisieren :lol:
Beim Erstellen einer Oberfläche zur Eingabe der versch. Parteien und deren Daten unterlief mir wohl ein Fehler, welchen ich einfach nicht zu beheben schaffe!!

Mein QGridLayout sorgt nicht für die Ordung, die ich will, sprich: Es lässt einfach Elemente weg und somit verrückt jede weitere Zeile in die vorherige...

Hier der Code:

HareNiemeyer.h

Code: Alles auswählen

//HareNiemeyer.h

#ifndef HARENIEMEYER_H
#define HARENIEMEYER_H

#include <iostream>
#include <QObject>
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QLabel>
#include <QString>
#include <QLineEdit>
#include <QComboBox>
#include <QPushButton>
#include <QMessageBox>

class Gui_HareNiemeyer : public QWidget
{
  Q_OBJECT

  private:
    QVBoxLayout *vbl_main;
    QHBoxLayout *hbl_parties;
    QGridLayout *gl_parties;
    QGroupBox *gb_parties1, *gb_parties2;
    QLabel *l_parties, *l_party[4], *l_votes[4], *l_seats[4];
    QComboBox *cb_parties;
    QLineEdit *le_party[4], *le_votes[4], *le_seats[4];
    QPushButton *pb_calculate; 

  public:
    Gui_HareNiemeyer();
    ~Gui_HareNiemeyer();
  
  public slots:
    QString Calculate(QString seats, QString parties, QString votes, QString misc);
};

#endif
HareNiemeyer.cpp

Code: Alles auswählen

//HareNiemeyer.cpp

#include "HareNiemeyer.h"

Gui_HareNiemeyer::Gui_HareNiemeyer()
{
//////
  vbl_main = new QVBoxLayout(this);

  hbl_parties = new QHBoxLayout;
  gl_parties = new QGridLayout;
  
  gb_parties1 = new QGroupBox("Anzahl");
  gb_parties2 = new QGroupBox("Definition");
//////

///
  l_parties = new QLabel("Anzahl Parteien:");
  cb_parties = new QComboBox;

  cb_parties->addItem("1");
  cb_parties->addItem("2");
  cb_parties->addItem("3");
  cb_parties->addItem("4");
  cb_parties->addItem("5");

  hbl_parties->addWidget(l_parties);
  hbl_parties->addWidget(cb_parties);
///
  l_party[0] = new QLabel("Partei 1");
  le_party[0] = new QLineEdit;
  l_party[1] = new QLabel("Partei 2");
  le_party[1] = new QLineEdit;
  l_party[2] = new QLabel("Partei 3");
  le_party[2] = new QLineEdit;
  l_party[3] = new QLabel("Partei 4");
  le_party[3] = new QLineEdit;
  l_party[4] = new QLabel("Partei 5");
  le_party[4] = new QLineEdit;

  l_votes[0] = new QLabel("Stimmen 1");
  le_votes[0] = new QLineEdit;
  l_votes[1] = new QLabel("Stimmen 2");
  le_votes[1] = new QLineEdit;
  l_votes[2] = new QLabel("Stimmen 3");
  le_votes[2] = new QLineEdit;
  l_votes[3] = new QLabel("Stimmen 4");
  le_votes[3] = new QLineEdit;
  l_votes[4] = new QLabel("Stimmen 5");
  le_votes[4] = new QLineEdit;

  l_seats[0] = new QLabel("Sitze 1");
  le_seats[0] = new QLineEdit;
  l_seats[1] = new QLabel("Sitze 2");
  le_seats[1] = new QLineEdit;
  l_seats[2] = new QLabel("Sitze 3");
  le_seats[2] = new QLineEdit;
  l_seats[3] = new QLabel("Sitze 4");
  le_seats[3] = new QLineEdit;
  l_seats[4] = new QLabel("Sitze 5");
  le_seats[4] = new QLineEdit;
  
  gl_parties->addWidget(l_party[0], 0, 0);
  gl_parties->addWidget(l_party[1], 0, 1);
  gl_parties->addWidget(l_party[2], 0, 2);
  gl_parties->addWidget(l_party[3], 0, 3);
  gl_parties->addWidget(l_party[4], 0, 4);
  gl_parties->addWidget(le_party[0], 1, 0);
  gl_parties->addWidget(le_party[1], 1, 1);
  gl_parties->addWidget(le_party[2], 1, 2);
  gl_parties->addWidget(le_party[3], 1, 3);
  gl_parties->addWidget(le_party[4], 1, 4);

  gl_parties->addWidget(l_votes[0], 2, 0);
  gl_parties->addWidget(l_votes[1], 2, 1);
  gl_parties->addWidget(l_votes[2], 2, 2);
  gl_parties->addWidget(l_votes[3], 2, 3);
  gl_parties->addWidget(l_votes[4], 2, 4);
  gl_parties->addWidget(le_votes[0], 3, 0);
  gl_parties->addWidget(le_votes[1], 3, 1);
  gl_parties->addWidget(le_votes[2], 3, 2);
  gl_parties->addWidget(le_votes[3], 3, 3);
  gl_parties->addWidget(le_votes[4], 3, 4);

  gl_parties->addWidget(l_seats[0], 4, 0);
  gl_parties->addWidget(l_seats[1], 4, 1);
  gl_parties->addWidget(l_seats[2], 4, 2);
  gl_parties->addWidget(l_seats[3], 4, 3);
  gl_parties->addWidget(l_seats[4], 4, 4);
  gl_parties->addWidget(le_seats[0], 5, 0);
  gl_parties->addWidget(le_seats[1], 5, 1);
  gl_parties->addWidget(le_seats[2], 5, 2);
  gl_parties->addWidget(le_seats[3], 5, 3);
  gl_parties->addWidget(le_seats[4], 5, 4);
///
  gb_parties1->setLayout(hbl_parties);
  gb_parties2->setLayout(gl_parties);
///
  vbl_main->addWidget(gb_parties1);
  vbl_main->addWidget(gb_parties2); 
}

Gui_HareNiemeyer::~Gui_HareNiemeyer()
{
}

QString Gui_HareNiemeyer::Calculate(QString seats, QString parties, QString votes, QString misc)
{
}
Mir ist schon aufgefallen, dass sich das QGridLayout beim Verschieben einzelner "Erstellungsbefehle" im Konstruktor verändert, d.h wenn ich zum Beispiel die GroupBoxen erst später erstelle, dann fehlen eben nicht die ersten Elemente, sondern die letzten...

Also irgendwas stimmt einfach nicht!

Hoffe auf Antwort!

PS:
Vielleicht könnte mir hier jemand einen Tipp geben, nach welcher Reihenfolge man normalerweise so ein Fenster erstellt:

Entweder so wie ich es mache (von außen nach innen):
Zuerst die Hauptkontainer alle deklarieren und definieren, dann die Inhalte deklarieren und definieren, dann die Inhalte zum Kontainer hinzufügen

Oder (von innen nach außen):
Zuerst mit den Inhalten anfangen, und am Schluss die Container erstellen und sie mit den Inhalten füllen

Oder (Mix):
Vielleicht ein Mix??



Viele Grüße
Gapa

Verfasst: 9. Dezember 2008 07:17
von macman
Keine Ahnung wie das aussehen soll was Du da erstellst, aber um das Layoutgeraffel zu verstehen, ist der Designer eine gute Hilfe. Erstelle da dein gewünschtes Layout, schick es durch den UIC und nimm dir die setupUi vor. Ist im Endeffekt oft der schnellere Weg.

Verfasst: 9. Dezember 2008 13:05
von sigvdr
Hallo,

mit

Code: Alles auswählen

QLineEdit *le_party[4], *le_votes[4], *le_seats[4];
erstellst du Arrays mit 4 Elementen und willst dann aber 5 benutzen!

So geht es besser.

Code: Alles auswählen

QLineEdit *le_party[5], *le_votes[5], *le_seats[5];
Gruß Sig

Array

Verfasst: 9. Dezember 2008 17:18
von Gapa
Hallo,
mit
Code:

QLineEdit *le_party[4], *le_votes[4], *le_seats[4];

erstellst du Arrays mit 4 Elementen und willst dann aber 5 benutzen!

So geht es besser.
Code:

QLineEdit *le_party[5], *le_votes[5], *le_seats[5];
Ähm, du weißt aber schon, dass man bei 0 anfängt zu zählen, und nicht bei 1... :wink:

Keine Ahnung wie das aussehen soll was Du da erstellst, aber um das Layoutgeraffel zu verstehen, ist der Designer eine gute Hilfe. Erstelle da dein gewünschtes Layout, schick es durch den UIC und nimm dir die setupUi vor. Ist im Endeffekt oft der schnellere Weg.
Jo werde ich wohl auch machen, denn ich hab ehrlich gesagt kein Bock mehr, den blöden Bug zu suchen^^.

Grüße
Gapa

Re: Array

Verfasst: 9. Dezember 2008 17:34
von Christian81
Gapa hat geschrieben:Hallo,
mit
Code:

QLineEdit *le_party[4], *le_votes[4], *le_seats[4];

erstellst du Arrays mit 4 Elementen und willst dann aber 5 benutzen!

So geht es besser.
Code:

QLineEdit *le_party[5], *le_votes[5], *le_seats[5];
Ähm, du weißt aber schon, dass man bei 0 anfängt zu zählen, und nicht bei 1... :wink:
Trotzdem ist das Array ein Element zu klein...
Falls man kein C kann gibt es immer noch std::vector<> bzw. QVector<> :P

Verfasst: 9. Dezember 2008 18:09
von MiKla
Mir ist das auch mal passiert. Ich habe es dann mit dem Debugger gefunden, nach langer Suche. Manchmal sieht man den Wald vor Bäumen nicht!
Array's deklarieren

Michael

...

Verfasst: 9. Dezember 2008 19:43
von Gapa
...ohne Kommentar :oops:

2 Fragen

Verfasst: 10. Dezember 2008 18:41
von Gapa
Hallöle nochmal,

ich hätte da jetzt nochmal 2 Fragen:

1.
Also wenn ich mich jetzt nicht komplett täusche, dann fängt man in c++ immer bei 0 an zu zählen, oder?? Und meines Wissens gilt das auch für Arrays!!

Dass ich in meinem Beispiel [5] statt [4] schreiben muss, ist mir jetzt auch klar, aber dann sind somit doch nur die Arrays 0 - 4 deklariert, oder??
Also wieso funktioniert dann auch das Array 5 ????
Wenn ich beispielsweise int test[5] schreibe, so existiert doch noch kein test[5], oder?? Es existieren nur die test[0] bis test[4] !
Aber dennoch geht das....wieso????

2.
Wenn ich (wie in meinem Code erkennbar ist) ein HBoxLayout erstelle, und ein Label sowie eine ComboBox reinpacke, wieso lässt sich dann weder die Größe/Position des Labels noch die Größe/Position der ComboBox per setGeometry(QRect(...)) bzw. setGeometry(...) modifizieren????

Viele Grüße
Gapa

Verfasst: 10. Dezember 2008 19:17
von MiKla
int test[5];
test[5]=10;
Damit überschreibst Du einen Speicherbereich irgendwo. Wenn Du Glück hast, stürzt das Programm ab. Wenn Du Pech hast suchst Du den Fehler im Programm immer noch, das heißt das Programm muss nicht abstürzen!!!
Genauso ein gern gemachter Fehler ist:

Code: Alles auswählen

int test[5];
for (int i=0; i<=5; i++)
    test[i]=i*10;
Michael

Verfasst: 11. Dezember 2008 07:05
von AuE
der Nachteil eines Ramdom Access Operators wurde soeben erklärt... ;-)

besser nen try catch drum schreiben.... also beim schreiben quasi pflicht. das lesen kann, muss aber net gut gehen!

setGeometry...

Verfasst: 11. Dezember 2008 12:52
von Gapa
Hallo,

also hatte ich mit Frage 1 doch recht! Vielen Dank für diese Bestätigung!!

Aber was ist mit Frage 2??
Wieso funzt mein setGeometry() nicht??

Viele Grüße
Gapa

Verfasst: 11. Dezember 2008 13:02
von MiKla
setGeometry() und HBoxLayout schließen sich eigentlich gegenseitig aus.
Was macht den ein HBoxLayout??? Wenn Du das weist, weist Du auch warum das nicht geht!

Michael