Seite 1 von 1

[Qt] Fenster Layout

Verfasst: 16.12.2010, 12:16
von Jonathan
Also, ich hab jetzt Qt installiert und bin soweit auch ganz angetan davon. Nur jetzt kriege ich mein Fenster Layout nicht so hin, wie ich will:
Als kleine Testapp möchte ich einen Modelviewer schreiben. Links eine Steuer- und Infoleiste, rechts ein OpenGL Fenster, indem das Modell gerendert wird.
Das erste Problem war jetzt, dass ich kein QGLWidget im Qt Designer einfügen kann. Nach ein bisschen rumsuchen erstelle ich mein RenderWindow selber und füge es in ein RenderWindowLayout ein, ungefähr so:

Code: Alles auswählen

Viewer::Viewer(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);

	m_RenderWindow=new RenderWindow(this);
	ui.RenderWindowLayout->addWidget(m_RenderWindow);
}
Insgesamt ist mein Fenster jetzt so aufgebaut: Ein HorizontalLayout indem sich 2 VerticalLayouts befinden, eins für die Toolbar, eins für das RenderWindow.
Jetzt will ich, dass beim Vergrößern des Fensters die Toolbar eine feste Breite hat (die ich am besten irgendwo angeben kann) und das RenderWindow den Rest des Platzes einnimmt. Leider ist die QtDesigner Layout Handbuchseite ziemlich knapp und beantwortet meine Fragen diesbezüglich nicht.

Wie krieg ich also ein Layout hin, dass sich so verhält, wie ich möchte?

Re: [Qt] Fenster Layout

Verfasst: 16.12.2010, 12:31
von Schrompf
Gute Frage. Es gibt sowas wie setMaxWidth() - allerdings nur für Widgets, nicht für Layouts. Und man kann Skalierungsfaktoren in Layouts angeben, also z.b. sagen, dass das zweite Element eines Layouts doppelt so viel Breite kriegen soll wie das erste. Probier mal, mit setStretch() bzw. setStretchFactor() dem linken Teil eine 0 oder dem rechten Teil eine große Skalierung überzuhelfen.

Re: [Qt] Fenster Layout

Verfasst: 16.12.2010, 13:45
von Thoran
Ich habe vor kurzem soetwas ähnliches gemacht. Wie im Screen zu sehen eine Anwendung mit Qt, die aus einem MDI-Bereich besteht und einer Toolbox. Dabei bleibt die Größe der Toolbox fest und der MDI-Bereich skaliert mit dem Fenster. Allerdings ist der gesamte Code bei mir vom QtDesigner erzeugt. Die beiden Elemente sind in einem HorizontalLayout angeordnet. Ich hab mal versucht die relevanten Stellen rauszusuchen.

Code: Alles auswählen

//Central widget, MDI Bereich und Layout anlegen
centralwidget = new QWidget(MainWindow);
centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
mdiArea = new QMdiArea(centralwidget);
horizontalLayout->addWidget(mdiArea);
MainWindow->setCentralWidget(centralwidget);

// Dockwidget für Toolbox und zusammen mit Toolbox und einer Page anlegen
dockWidget = new QDockWidget(MainWindow); dockWidget->setObjectName(QString::fromUtf8("dockWidget"));
dockWidget->setMinimumSize(QSize(200, 37));
dockWidgetContents = new QWidget();
dockWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents"));
toolBox = new QToolBox(dockWidgetContents);
toolBox->setObjectName(QString::fromUtf8("toolBox"));
toolBox->setGeometry(QRect(0, 0, 191, 271));
page = new QWidget();
page->setObjectName(QString::fromUtf8("page"));
page->setGeometry(QRect(0, 0, 191, 217));
toolBox->addItem(page, QString::fromUtf8("Page 1"));
dockWidget->setWidget(dockWidgetContents);
MainWindow->addDockWidget(static_cast<Qt::DockWidgetArea>(2), dockWidget);
Ich hoffe das hilft dir weiter.

Thoran

Re: [Qt] Fenster Layout

Verfasst: 16.12.2010, 14:20
von joggel
Ja, das war auch meine Idee...
Die Toolbar mit setMinSize und setMaxSize festzulegen.
Der Rest müsste dann das Layout machen.

Re: [Qt] Fenster Layout

Verfasst: 16.12.2010, 15:24
von Jonathan
Also irgendwie ist das alles komisch. Jetzt werden teilweise die ListWidgets einfach so rechts abgeschnitten, weil da dann das Layout zuende ist oder so. Dabei könnte man die Listen auch einfach automatisch schmaler machen...

Aber vielleicht verschachtele ich die Widgets auch einfach falsch. Sollte man z.B. in ein Layout nochmal ein normales QWidget machen und darein dann die Listen und Labels? Oder sollte ich einfach nur Layouts ineinander verschachteln und darein dann alles andere schmeißen?
Sollte ich für das Ogl Fenster, das ich ja erst im Code hinzufüge im Designer ein extra leeres Layout oder Widget vorsehen, oder einfach gar nix als Platzhalter?

Ich meine, sicherlich gibt es doch für all diese Möglichkeiten Richtlinien wie es eigentlich gedacht ist. Das durch ausprobieren herauszufinden, würde mir aber zu lange dauern.

Also: Wie genau baue ich am besten mein Viewer Layout auf?

Ahja, hier mal mein Versuch:
http://www.pasteall.org/17663/xml

Re: [Qt] Fenster Layout

Verfasst: 16.12.2010, 15:32
von Schrompf
Du brauchst definitiv keine Dummy-Widgets einfügen. Du kannst sowohl Widgets als auch Unter-Layouts in ein Layout einfügen. Das Label als Dummy-Widget ist ne Idee, wenn Du dann halt daran denkst, es auch rauszulöschen, wenn Du das OpenGL-Widget einfügst. Genaue Details kann ich Dir aber nicht erzählen, weil ich meine GUIs immer gleich im Code zusammengebaut habe.

Alternativ schreibst Du eine Helferklasse, um ein beliebiges Widget in den QDesigner zu integrieren. Das ist aber ne Stunde Arbeit, das würde ich nicht machen, wenn es um so ein banales Anliegen geht. Das muss einfacher gehen.

Re: [Qt] Fenster Layout

Verfasst: 16.12.2010, 15:35
von Matthias Gubisch
Also Layouts kannst du meines Wissens schon verschachteln, ansonsten kannst du auch einfach ein Grid Layout mit einer Zeile und zwei Spalten nehmen.

Wenn du bei den Layouts bleibst, dann musst do wenn ich mich nicht irre layoutSizeConstraint oder so ähnlich auf FixedSize setzen, damit sollte die Toolbar immer die gleiche Breite haben.
Bei den ListWidgets, ListViews musst du den resizeMode auf Adjust stellen.

Sollte alles im Desinger machbar sein.
Hab leider grad keinen Desinger zur hand sonst hätt ichs schnell getestet.

Gruß
Matthias

Re: [Qt] Fenster Layout

Verfasst: 16.12.2010, 15:56
von klickverbot
Ich fürchte, ich habe dein Problem nicht ganz verstanden, aber:

Nimm für das OpenGL-Widget im Viewer einfach ein normales Widget und »promote« es dann mit der Funktion im Kontextmenü zu deiner eigenen, z.B. von QGLWidget abgeleiteten Klasse.

Was das Layout betrifft, kannst du mit QSizePolicy rumspielen, um den Effekt zu erreichen, den du willst (z.B. für die Toolbar »Preferred« mit horstretch 0 und verstretch 0 und für das GL-Widget »Expanding« mit 1, 1 – oder was auch immer du eben erreichen willst).

Re: [Qt] Fenster Layout

Verfasst: 16.12.2010, 18:38
von Jonathan
Also dass mit dem PromoteWidget funktioniert anscheinend schonmal sehr gut, danke für den Tipp :)

Mit den SIzePolicys rumspielen hat auch schon ein wenig gebracht, so ganz zufrieden bin ich noch nicht, aber ich glaub ich bin am richtigen Weg.