'ein' Widget in 2 Layouts

Alles rund um die Programmierung mit Qt
Antworten
Noci
Beiträge: 7
Registriert: 28. Januar 2008 09:09

'ein' Widget in 2 Layouts

Beitrag von Noci »

Hallo,
Ich programmiere mit Qt noch nicht lange, um genau zu sein ist es mein erstes Project, und ich stehe nun vor einem Problem bei dem ich einfach nicht weiter komme.
Ich schreibe eine Anwendung mit der man sich 3-dimensionale Objekte anschauen kann und habe dafür 4 QtOpenGL-Widgets für jeweils unterschiedliche ansichten. Ich möchte, dass man sich jedes Fenster einzeln anschauen kann, um eine größere Übersicht zu haben aber auch alle 4 gleichzeitig nebeneinander ( bzw. 2 Reihen à 2 Widgets ).
Gelöst(versucht) habe ich das ganze bisher mit QStackedLayout mit welchem ich durch die Einzelansichten und die 4er Ansicht switchen kann. Die 4er Ansicht ist mit einem QGridLayout realisiert.

Zur erläuterung des Problemes: Da ich anscheinend kein Widget gleichzeitig in 2 Layouts implementiert haben kann muss ich die Widgets um zwischen Einzel- und 4er-Ansicht wechseln zu können wohl aus dem vorher aktivierten Layout Entfernen. Generell startet die Anwendung mit der 4er-Ansicht wodurch folgendes zu Beginn geladen wird (klappt soweit auch):

Code: Alles auswählen

viewAllLayout->addWidget( xytWidget, 0, 0 );
viewAllLayout->addWidget( xzWidget, 0, 1 );
viewAllLayout->addWidget( yzWidget 1, 0 );
viewAllLayout->addWidget( xybWidget, 1, 1 );
viewAllWidget->setLayout( viewAllLayout );

desktopLayout->addWidget( viewAllWidget );
setCentralWidget( desktop );
xyt-, xz-, yz- und xybWidget sind die einzelnen QtOpenGL-Widgets. allLayout ist dementsprechend das QGridLayout, desktopLayout das QStackedLayout ( viewAllWidget somit zum Index 0). (( desktopLayout hat hier einen count() von 1, passt ))
Wechsel ich nun zu einer Einzelansicht gebe ich die Widgets „frei“ und füge sie dem StackedLayout ein

Code: Alles auswählen

viewAllLayout->removeWidget( xytWidget );
viewAllLayout->removeWidget( xzWidget );
viewAllLayout->removeWidget( yzWidget );
viewAllLayout->removeWidget( xybWidget );
desktopLayout->insertWidget( 1, xytWidget );
desktopLayout->insertWidget( 2, xzWidget );
desktopLayout->insertWidget( 3, yzWidget );
desktopLayout->insertWidget( 4, xybWidget );
Klappt soweit wunderbar, ich kann nun durch die Einzelansichten ohne Probleme switchen (( desktopLayout hat hier einen count() von 5, passt )).
Will ich nun wieder in die 4er Ansicht muss ich wieder removen und einfügen:

Code: Alles auswählen

desktopLayout->removeWidget( xytWidget );
desktopLayout->removeWidget( xzWidget );
desktopLayout->removeWidget( yzWidget );
desktopLayout->removeWidget( xybWidget );
viewAllLayout->addWidget( xytWidget, 0, 0 );
viewAllLayout->addWidget( xzWidget, 0, 1 );
viewAllLayout->addWidget( yzWidget, 1, 0 );
viewAllLayout->addWidget( xybWidget, 1, 1 );
Hier das Problem: Nach dem “Freigeben”(remove) der Widgets aus dem StackedLayout hat dieses noch einen count() von 1, was passt, ergo die Widgets sind freigegeben. Allerdings bekomme ich sie nicht mehr in die 4er Ansicht (desktopLayout) eingebunden, er zeigt sie mir dort einfach nie wieder an.
Vielleicht seht ihr ja meinen Fehler und denkt euch „ouch“ oder könnt mir mit einer anderen Lösung helfen, ich wäre zumindest sehr dankbar...

Noci
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Gibt es keine Debug-Ausgabe in irgend einer Hinsicht (Widget is already in Layout blah oder so)?
Warum kannst Du die Widgets nicht einfach zweimal erzeugen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Noci
Beiträge: 7
Registriert: 28. Januar 2008 09:09

Beitrag von Noci »

ich schreibe den code so und compiliere via minGW über Console, um ehrlich zu sein habe ich keine Ahnung wie ich da einen Debug laufen lasse, wobei ich da generell nicht so bewandert bin..
Nun die Widgets 2 mal zu erstellen war mein gedachter Letzter Ausgweg, da ich befürchte es könnte eventuell etwas lastig auf die Dauer werden. Ebenfalls die ganzen event-Veränderungen die sich dann auf die "kopie" mit auswirken müssten wollte ich mir ersparen

*edit:
Ok, ich habe nun den Count auch auf das GridLayout ausgeführt (hätte es vielleicht früher tun sollen). Das Ergebnis ist, in der 4er-Ansicht hat es einen count() von 4, wechsel ich in die Einzelansicht beträgt dessen count() 0, alle Widgets wurden rausgenommen. Wechsel ich wieder in die 4er Ansicht bekommt er tatsächlich wieder einen count() von 4, die Widgets sind drin, er zeigt sie nur nicht an Oo update() hilft nichts, hmm
Noci
Beiträge: 7
Registriert: 28. Januar 2008 09:09

Beitrag von Noci »

vll doch jmd. eine Idee woran das liegen könnte, was ich da falsch mache?
Antworten