2010-09-21 16 views
9

Was ich versuche zu erreichen ist, dass ein Widget in zwei verschiedenen Layouts existieren könnte, in diesem Fall in QHBoxLayout und in QVBoxLayout. Ich implementiere ein System, das dynamisch zwischen den beiden Layouts wechselt, wenn sich die Bildschirmausrichtung eines Geräts ändert.Qt: Gleiches Widget in zwei verschiedenen Layouts

Derzeit bin die Schaffung mir, sagen sie mal, einen komplexen Verbund Widget genannt mywidget und das Hinzufügen in ein zwei verschiedenen Layouts:

MyWidget *wgt = new QWidget(); 
QVBoxLayout vlayout; 
QHBoxLayout hlayout; 

vlayout->addWidget(wgt); 
hlayout->addWidget(wgt); 

Nun stell dir vor, dass beiden Layouts innerhalb eines ‚root‘ Layouts gehostet werden, und dass Dieses Root-Layout kann in einen Modus mit größerem als hohem "Landscape" und in einen Modus mit größerem als breitem "Portrait" geändert werden.

Das MyWidget wird nur in dem ersten Layout korrekt angezeigt, in dem es hinzugefügt wird, und wenn die Layouts umgeschaltet werden, zeigt es alles falsch oder gar nicht an.

Ich weiß nicht, ob ich hier einen Sinn habe, aber das ist mein Problem. Wenn das Schalterereignis aufgerufen wird, sollten alle untergeordneten Widgets und Layouts in der Größe geändert werden, sodass es immer richtig aussieht. Das einzige Problem ist, dass ich nicht weiß wie.

+0

Verwandte Frage: http://stackoverflow.com/questions/2990283/qt-change-qwidget-layout – rubenvb

Antwort

4

Dies ist nicht besonders einfach zu tun, ist aber möglich.

Zunächst würde ich empfehlen, dass Sie tatsächlich zwei verschiedene Widgets erstellen, eines für die vertikale und eines für die horizontale, und verwalten Sie die Dinge auf diese Weise. Wenn die Quelldaten ordnungsgemäß von der UI-Klasse getrennt sind, sollten Sie dies ohne große Probleme tun können, jedoch mit etwas Speicheraufwand.

Eine Möglichkeit, wie Sie möchten, wäre vollständig remove the widgets von einem Layout und fügen Sie sie zu den anderen, wenn Sie die Anordnung auf dem Bildschirm ändern müssen, und ändern Sie das Layout, das Widget hinzugefügt wird. Dies sollte dazu führen, dass dieselben Widgets auf andere Weise gezeichnet werden.

Eine andere, kompliziertere Art und Weise, dies zu handhaben (obwohl potenziell effizienter) wäre write your own layout und es hätte die Aufgabe, Widgets basierend auf der Orientierungsänderung neu anzuordnen.

+1

ich beschlossen, ein Verfahren zu schreiben, die automatisch, wenn die Orientierungsänderungen aufgerufen wird, dass (nach dem Entfernen) fügen die Widgets wieder in das Layout. – Gerstmann

12

Dies ist keine allgemeine Lösung zum Ändern von Layouts, sondern eine einfache Lösung in Ihrem Fall: Ändern Sie einfach die Richtung des Boxlayouts.

hlayout->setDirection(QBoxLayout::TopToBottom); 
// now your hboxlayout works as vertical layout 

hlayout->setDirection(QBoxLayout::LeftToRight); 
// and now it is horizontal again