Seite 1 von 1

"Dynamische" Layouts

Verfasst: 2. April 2006 15:26
von prof_maad
Hallo alle miteinander,

ich habe derzeit ein großes Problem in meinem Projekt:

Ich habe einen QFrame, dessen Layout sich im Verlauf des Programms ändert.
Sprich:
Am Anfang hat er ein leeres Layout, dann wird ihm ein anderes Layout zugewiesen, und dann wieder nen anderes, etc.

Das Problem ist, dass er die Änderung nicht annimmt. Er bleibt stets bei seinem alten Layout.
Hier die Code-Auszüge:
Header:

Code: Alles auswählen

QFrame *modulFrame;
QLabel *mainDummyLabel;
QLabel *modulLabel;
QVBoxLayout *modulLayout;
QVBoxLayout *mainDummyLayout;
Konstruktor:

Code: Alles auswählen

modulLabel = new QLabel(tr("<h2>Module</h2>"));
modulLayout = new QVBoxLayout();
modulFrame = new QFrame();
mainDummyLabel = new QLabel("MainFrame");
mainDummyLayout = new QVBoxLayout();
mainDummyLayout->addWidget(mainDummyLabel);
modulFrame->setLayout(mainDummyLayout);
Neues Layout:

Code: Alles auswählen

QLayoutItem *child;
while ((child = modulLayout->takeAt(0)) != 0)
{
    delete child;
}
Layout *toDelete = modulFrame->layout();
if(toDelete!=0)
{
    delete toDelete;
}
   	
modulLayout = new QVBoxLayout();
    
modulLayout->addWidget(modulLabel);
modulLayout->addStretch(1);
   	
for(int i=0;i<modulList->size();i++)
{
    modulLayout->addWidget(modulList->at(i)->modulCheck);
}
modulLayout->addStretch(3);
   	
modulFrame->setLayout(modulLayout);
Hat jemand eine Idee, wie man so etwas realisieren sollte?

Danke im Voraus und Ciao,

Prof. MAAD

Verfasst: 5. Mai 2006 12:27
von hulk
Hallo

Ich habe das gleiche Problem und bin nach tagelanger Suche auf keine Lösung gekommen. Hat inzwischen jemand eine Idee??

Hast du, prof_maad, das vielleicht schon selbst lösen können? Ich wäre dir für eine Antwort sehr dankbar

Hulk

Verfasst: 7. Juli 2006 13:18
von mikro
Habe mich jetzt eine ganze Zeitlang mit dem gleichen Problem rumgeschlagen und auch mit dem Support von Qt darüber diskutiert. Jetzt verstehe ich endlich wieso es nicht klappt und habe einen Workaround:

QLayouts stammen von QObject ab, daher geht man davon aus, dass sie alle ihre Kinder löschen wenn sie selbst gelöscht werden. QWidgets akzeptieren aber nur andere QWidgets als parent. Ein QLayout kann daher nicht der parent von einem QWidget wie einem pushbutton oder lineEdit o.ä. sein. Der Parent dieser auf dem Layout das man auswechseln will vorhandenen Widgets ist also das Widget oberhalb des auszuwechselnden Layout.
Ich habe daher keine andere Möglichkeit gefunden, als dem QLayout zuerst einmal noch ein QFrame zuzufügen, und darunter alles andere. So können alle anderen Widgets diesen QFrame als parent haben und werden automatisch gelöscht wenn ich den lösche. Wer sowas implementieren will kann sich beiliegendes Beispiel anschauen. So funktionierts ;)

Verfasst: 9. Juli 2006 15:13
von Whitefurrows
Hallo,

das Programm stürtzt an folgender stelle ab:

Code: Alles auswählen

// the first two Buttons get a HBoxLayout
    QPushButton* button1 = new QPushButton(round+"One",frame);
    QHBoxLayout* lay1    = new QHBoxLayout(frame);
    lay1->addWidget(button1);
Fehlermeldung angefügt!

Gruß

Whitefurrows

Verfasst: 9. Juli 2006 15:37
von mikro
interessant. ich nehme an nicht unter windows? welche Qt-Version?

Verfasst: 9. Juli 2006 16:13
von Whitefurrows
QT-Version ist 4.1.0, OS ist leider Windows XP SP2! Hast du evtl. ein Idee?

Verfasst: 9. Juli 2006 16:33
von mikro
also bei mir ist es auch XP SP2, unverändert sollte der Code dann also gleich laufen. allerdings habe ich Qt 4.1.3 - vielleicht ist da schon ein Bugfix drin?