"Dynamische" Layouts

Alles rund um die Programmierung mit Qt
Antworten
prof_maad
Beiträge: 40
Registriert: 25. September 2005 14:33
Wohnort: /root/

"Dynamische" Layouts

Beitrag 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
hulk
Beiträge: 10
Registriert: 21. Februar 2006 11:41

Beitrag 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
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag 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 ;)
Dateianhänge
testlayout.zip
Testprojekt
(5.45 KiB) 211-mal heruntergeladen
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag 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
Dateianhänge
errMsg.PNG
errMsg.PNG (17.68 KiB) 4395 mal betrachtet
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

interessant. ich nehme an nicht unter windows? welche Qt-Version?
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

QT-Version ist 4.1.0, OS ist leider Windows XP SP2! Hast du evtl. ein Idee?
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

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