QGridLayout spinnt!

Alles rund um die Programmierung mit Qt
Antworten
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

QGridLayout spinnt!

Beitrag 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
Gestern war heute noch morgen!
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag 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
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

Array

Beitrag 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
Gestern war heute noch morgen!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Array

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
MiKla
Beiträge: 134
Registriert: 29. Juli 2007 15:29

Beitrag 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
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

...

Beitrag von Gapa »

...ohne Kommentar :oops:
Gestern war heute noch morgen!
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

2 Fragen

Beitrag 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
Gestern war heute noch morgen!
MiKla
Beiträge: 134
Registriert: 29. Juli 2007 15:29

Beitrag 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
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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!
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

setGeometry...

Beitrag 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
Gestern war heute noch morgen!
MiKla
Beiträge: 134
Registriert: 29. Juli 2007 15:29

Beitrag 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
Antworten