Widget nach setLayout zu GridLayout während laufzeit

Alles rund um die Programmierung mit Qt
Antworten
exaveal
Beiträge: 14
Registriert: 18. Dezember 2009 16:05

Widget nach setLayout zu GridLayout während laufzeit

Beitrag von exaveal »

Hy.

Folgendes Problem:

Ich habe ein Fenster das durch ein QGridlayout in 6 Zellen (3x3) unterteilt ist.
Zeile 1: Programmname ... etc.
Zeile 2: Menü mit QButtons
Zeile 3: Platzhalter für den Inhalt

Dieses Design wird bei erstellen eines Objekts der Klasse im Konstruktor initialisiert. Abschließend erfolgt ein setLayout(layout).

Nun soll man natürlich in dem Programm navigieren können:
Wenn ich auf einen der QButtons im Menü klicke, soll ein Widget in Zeile 3 geladen werden, also mit einem layout->addWidget(neuesWidget)
Dies erfolgt nun natürlich nach dem setLayout.
Das neue Widget wird nun leider nicht angezeigt.

Im Netz lese ich nur, dass ich das Layout wieder löschen muss, und dann wieder setzen. Aber ich kann ja nicht jedesmal wenn ich auf einen Button klicke das komplette Layout rücksetzen.


Leider habe ich das Konzept, nachdem QT seine Grafik aufbaut wohl noch nicht ganz verstanden.
Die mitgeliferten Tutorials und Beispiele haben nur Projekte, bei denen bereits von Anfang an das Fensterlayout fest definiert ist.


Ich würde mich freuen, wenn mir jemand einen Tipp geben kann, ich hock jetzt die zweite Woche an diesem Problem und komme keinen Zentimeter weiter :(
GSoft
Beiträge: 24
Registriert: 30. Dezember 2008 01:16
Wohnort: NRW

Beitrag von GSoft »

Probier mal nach dem du das Widget hinzugefügt hast, von dem Hauptfenster die Methode update() aufzurufen.

also

Code: Alles auswählen

this->update(); 
Ob es funktioniert weiß ich nicht, aber kannst ja trotzdem versuchen.

Gruß
GSoft

PS: Ansonsten solltest du ein wenig Quelltext zeigen, damit uns das mal angucken können.
Lerne aus den Fehlern Anderer! Du hast nicht die Zeit sie selbst zu machen.
exaveal
Beiträge: 14
Registriert: 18. Dezember 2009 16:05

Beitrag von exaveal »

Mit update() habe ich es auch shcon probiert, aber ohne Erfolg.

Also ich versuche das mit dem Quellcode mal möglichst einfach und übersichtlich zu machen ...

1. Ich habe die Klasse MCT. Sie ist mein Hauptfenster, in dem das Layout steckt. Im Konstruktor wird folgendes initialisiert ...

Code: Alles auswählen

// --- Buttons
buttonTestNeu = new QPushButton("Menuepunkt1", this);
buttonTestZufall = new QPushButton("Menuepunkt2", this);
buttonTestFalsch = new QPushButton("Menuepunkt3", this);
buttonHistorie = new QPushButton("Menuepunkt4", this);
buttonEinstellungen = new QPushButton("Menuepunkt5", this);
// --- Buttons Ende


// --- Layout
layoutFenster = new QGridLayout;  // Das Fensterlayout (hauptlayout)
layoutMenue = new QHBoxLayout;  // Die Menuebuttons sind in eigenem Container

// Labels ...
layoutFenster->addWidget(labInformationen, 0, 0, Qt::AlignTop);
layoutFenster->addWidget(labUeberschrift, 0, 1, Qt::AlignTop | Qt::AlignHCenter);
layoutFenster->addWidget(labVersion, 0, 2, Qt::AlignTop | Qt::AlignRight);
// ... Labels

// Menuelayout nimmt alle QButtons auf und wird in das Fensterlayout eingebunden
layoutMenue->addWidget(buttonTestNeu);
layoutMenue->addWidget(buttonTestZufall);
layoutMenue->addWidget(buttonTestFalsch);
layoutMenue->addWidget(buttonHistorie);
layoutMenue->addWidget(buttonEinstellungen);
layoutFenster->addLayout(layoutMenue, 1, 0, 1, 3, Qt::AlignTop | Qt::AlignHCenter);

setLayout(layoutFenster);
// --- Layout Ende
das Fenster ist nach dem Konstruktor durchlauf initialisiert.
Nun soll durch das Drücken auf einer der Menübuttons ein Widget geladen werden ...

Code: Alles auswählen

void MCT::Button_gedrueckt()
{
  myWidget = new MyWidget(this);
  layoutFenster->addWidget(myWidget, 2, 0, 6, 3);
  myWidget->show();
  layoutFenster->update();
}

Leider wird dieses Widget nachträglich nicht mehr hinzugefügt.
Ich kann ja nicht jedesmal das Layout neu bauen und alle Labels, Buttons einzeln da reinstopfen. :(
GSoft
Beiträge: 24
Registriert: 30. Dezember 2008 01:16
Wohnort: NRW

Beitrag von GSoft »

exaveal hat geschrieben:

Code: Alles auswählen

void MCT::Button_gedrueckt()
{
  myWidget = new MyWidget(this);
  layoutFenster->addWidget(myWidget, 2, 0, 6, 3);
  myWidget->show();
  layoutFenster->update();
}
Bist du dir sicher das nach dem Drücken des Buttons auch wirklich in diese Methode/Slot gegangen wird?
exaveal hat geschrieben: Leider wird dieses Widget nachträglich nicht mehr hinzugefügt.
Ich kann ja nicht jedesmal das Layout neu bauen und alle Labels, Buttons einzeln da reinstopfen. :(
Dies ist auch überhaupt nicht notwendig! Habe gerade kurz diese Beispiel-Anwendung geschrieben in der es funktioniert

Header-Datei:

Code: Alles auswählen


#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>

class Widget: public QWidget
{
   // Das hier ist SEEEEHR wichtig, da sonst Signale und Slots nicht funktionieren!!!!!!!
   Q_OBJECT

public:
   Widget(QWidget *aParent = 0);

private slots:
   void addButton();

private:
   QVBoxLayout m_vlForm;
   QPushButton m_btnAdd;
};

Cpp-Datei:

Code: Alles auswählen

Widget::Widget(QWidget *aParent): 
   QWidget(aParent)
{
   // Hier wird die erste Schaltfläche dem Layout hinzugefügt!
   m_vlForm.addWidget(&m_btnAdd);

   // Hier wird das Signal clicked mit dem Slot addButton verbunden
   connect(&m_btnAdd, SIGNAL(clicked()), SLOT(addButton()));

   // Hier wird das m_vlForm für das Widget gesetzt.
   setLayout(&m_vlForm);
}


void Widget::addButton()
{
   // Hier wird eine zusätzliche Schaltfläche dem Layout hinzufügt!
   m_vlForm.addWidget(new QPushButton("test"));
}

Dein Quelltext sieht soweit ganz OK aus, allerdings kann ich nicht sagen woran es liegt wenn ich nicht den kompletten Quelltext (also Header und CPP-Datei) sehe...

Gruß
GSoft
Lerne aus den Fehlern Anderer! Du hast nicht die Zeit sie selbst zu machen.
Antworten