QGridLayout im QGridLayout

Alles rund um die Programmierung mit Qt
Antworten
ChornHulio
Beiträge: 62
Registriert: 7. November 2008 11:02

QGridLayout im QGridLayout

Beitrag von ChornHulio »

Hallo zusammen,

ich schreibe mir von Hand gerade eine GUI zusammen. Man muss dazusagen, dass ich kein OOP-Profi bin. Also wenn ich irgendwo Blödsinn fabriziere, dann was das gut wenn ihr das sagt...

Also ich erzeuge in einem QGridLayout (das in CGUI.h erzeugt wird) ein weiteres QGridLayout (das in CGUIAufzSys.h). In einer weiteren Datei ist es aus Übersichtlichkeitsgründen.

Das Programm wird erfolgreich kompiliert. Doch das zweite GridLayout ist einfach nicht zu sehen. Auf der Ausgabe wird folgendes ausgegeben:
QLayout: Attempting to add QLayout "" to CGUI "", which already has a layout
Hier Ausschnitte aus dem Code:

CGUI.h

Code: Alles auswählen

#include "CGUIAufzSys.h"

class CGUI : public QMainWindow
{
    ...
    //Gesamtlayout erstellen
    QGridLayout* layout;
    QWidget *centralWindow;

    //Inneres QGridLayout erstellen
    CGUIAufzSys *guiAufzSys;

public:
    CGUI(QMainWindow *parent = 0, Qt::WindowFlags flags=0);
...
};
CGUI.cpp

Code: Alles auswählen

CGUI::CGUI(QMainWindow *parent, Qt::WindowFlags flags) : QMainWindow(parent,flags)
{
...
    layout = new QGridLayout;
    centralWindow = new QWidget;
    setCentralWidget(centralWindow);
    centralWindow->setLayout(layout);
...
    guiAufzSys = new CGUIAufzSys(this);
    layout->addLayout(guiAufzSys, 0, 0, 0, 1);
...
}
CGUIAufzSys.h

Code: Alles auswählen

class CGUIAufzSys : public QGridLayout
{
    Q_OBJECT
    QGridLayout *layoutAufzSys;

    //Layout Test
    QPushButton *button1;

public:
    CGUIAufzSys(QWidget *parent);
};
CGUIAufzSys.cpp

Code: Alles auswählen

#include "CGUIAufzSys.h"

CGUIAufzSys::CGUIAufzSys(QWidget *parent) : QGridLayout(parent)
{
    layoutAufzSys = new QGridLayout;

    //Layout TestButton
    button1 = new QPushButton("One");

    //layoutAufzSys wird mit Inhalt gefühlt
    layoutAufzSys -> addWidget(button1, 0, 0);
}
Weiß jemand was ich falsch mache? Danke für eure Antworten!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

CGui ist ein QMainWindow.
Dein Fehler liegt hier:

Code: Alles auswählen

CGUIAufzSys::CGUIAufzSys(QWidget *parent) : QGridLayout(parent)

Code: Alles auswählen

CGUI::CGUI(QMainWindow *parent, Qt::WindowFlags flags) : QMainWindow(parent,flags) 
{  
... 
    guiAufzSys = new CGUIAufzSys(this); 
...
}
versucht, das CGUIAufzSys als Layout von CGUI zu setzen, was fehlschlägt.
Also das parent im Konstruktor deines CGUIAufszSys (übrigens in recht nichtssagender Name...) weglassen, oder gleich richtig rangehen.

Im Prizip soll ja dein CGUIAufzSys etwas darstellen. Das ist die Aufgabe eines QWidget. Ein Layout ist dazu da etwas in ordentlicher Weise auf einem Widget anzuordnen, z.B. in einem Grid.
Somit ist es klar, dass du eigentlich von QWidget ableiten solltest und dein Gridlayout, was jetzt als eigene Klasse implementiert ist, einfach im Konstruktor zu erstellen und mittels setLayout setzen. Dieses Widget dann wie alle anderen Widgets verwenden.

Du bekommst nämlich bei deiner Herangehensweise noch ein Problem: Deine abgeleitete Klasse ist ein QGridLayout, damit können auch alle Methoden von QGridLayout aufgerufen werden, insbsondere addWidget/removeWidget. Und das willst du doch nicht, oder?
ChornHulio
Beiträge: 62
Registriert: 7. November 2008 11:02

Danke!

Beitrag von ChornHulio »

Danke für deine schnelle Antwort! Und ja du hast Recht - und es funktioniert auch noch :D
Antworten