Seite 1 von 1

Aufbau eines MainWindow mit Widgets

Verfasst: 25. Januar 2010 16:40
von curator
Hallo.

Ich fürchte, ich habe ein Brett vor dem Kopf. Vielleicht kann mit jemand helfen. Es geht um folgendes Problem:

Ich habe eine MainWindow, das soll in 2 Widgets aufgeteilt werden, mit einem GridLayout (auch wenn das bei 1x2 übertriben ist).

Diese Widgets wiederum sind Abgeleitete Klassen von QWidget:

Code: Alles auswählen

class LeftWidget(*parent):QWidget(parent)
class RightWidget(*parent):QGLWidget(parent)
Das Linke Widget soll jetzt ein GridLayout bekomen, für Buttons etc, das Rechte soll plotten.

Damit es nicht heißt, ich hätte mich nicht damit beschäftigt, hier meine bisherigen Ergebnisse:

QMainWindow hat ein CentralWidget, dass will ich wohl splitten. Also

Schreibe ich in den Konstruktor des QMainWindow (bzw. der abgeleiteten Klasse MainWindow

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent)
{
     this->setCentralWidget(new QWidget(this));
     QGridLayout *l= new QGridLayout();
     
     LeftWidget *lw = new LeftWidget(this);
     RightWidget *rw = new RightWidget(this);

     l->addWidget(lw,0,0);
     l->addWidget(rw,0,1);
    
     centralWidget()->setLayout(l);
}

So, das RightWidget Plottet einfach nur, gekommt also kein Layout
Das Linke habe ich jetzt so gebaut.

Code: Alles auswählen

RightWidget::RightWidget(QWidget *parent):QWidget(parent)
{
     QGridLayout *l= new QGridLayout();
     
     QLabel *label = new QLabel("Hallo");
     QLineEdit *lineedit = new QLineEdit("Welt");


     l->addWidget(label,0,0);
     l->addWidget(lineedit,0,1);
    
     setLayout(l);
}
Fertig! Leider starte ich das Programm, ich bekomme nur in MainWindow, wo das LeftWidget offenbar das einzige ist. Ich sehe "Hallo Welt", aber das RightWidget ist nicht da.

Ich finde leider den Denkfehler nicht. Kann mir jemand auf die Sprünge helfen, oder eine Stück Code von sich zum anschauen geben, das diese Funktionalität (oder so ähnlich) realisiert?

Vielen Dank im voraus,
curator

Verfasst: 25. Januar 2010 19:54
von upsala
Probiers mal so:

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent) 
{ 
  QWidget *wdg=new QWidget(this);
  setCentralWidget(wdg); 
  QGridLayout *l= new QGridLayout(); 
  wdg->setLayout(l);
       
  LeftWidget *lw = new LeftWidget(wdg); 
  RightWidget *rw = new RightWidget(wdg); 
 
  l->addWidget(lw,0,0); 
  l->addWidget(rw,0,1);     
}

Verfasst: 25. Januar 2010 22:04
von curator
Hallo,

Hab das so übernommen, hilft aber nichts.

Stattdessen geht es, wenn ich in der LeftWidget die Zeile

setLayout(l);

weglasse.

Also das GridLayout nicht mit dem Widget verknüpfe. Das gibt aber doch keinen Sinn oder? Oder setzt der das Layout mit dem Befehl als Layout für das CentralWidget des MainWindow, weil genauso sieht es ja aus.

Vielen Dank für weitere Ideen,

curator

Verfasst: 26. Januar 2010 22:21
von curator
Hallo nochmal, ich glaub ich hab das Problem rausgefunden.

Grundsätzlich setzt der das Layout richtig, wenn ich als Rechts statt dem QGLWidget was anderes mache geht es. Ich gehe daher davon aus, das Qt nicht im GridLayout mit dem GLWidget zusammenarbeiten kann, weil es ja quasi keine feste Größe hat. Habe ich zwei Buttons, teilt der in der Mitte, bei verschiedenen Elementen wohl woanders. Jetzt teilt der wohl so, dass das QGLWidget (Rechts) nur 10px breit ist.

Ich will jedoch eine Aufteilung Hälfte Hälfte.

Wie geht das ?

Gruß,
curator

Verfasst: 27. Januar 2010 03:39
von FaS
Die Größenberechnung erfolgt nach verschiedenen Regeln, die meisten kann man im Qt Designer steuern und sich direkt den Code davon ansehen, wenn man zufrieden ist. Gerade bei Layouts ist er eine ziemlich gute Hilfe.
In deinem Fall genügt wohl: column stretch.

PS: Ein QHBoxLayout ist bestimmt 1µs schneller als ein QGridLayout.

Gruß,
FaS