[Qt] Fenster Layout

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Jonathan
Establishment
Beiträge: 2398
Registriert: 04.08.2004, 20:06
Kontaktdaten:

[Qt] Fenster Layout

Beitrag 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?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 4886
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [Qt] Fenster Layout

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Thoran
Establishment
Beiträge: 224
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

Re: [Qt] Fenster Layout

Beitrag 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
Dateianhänge
Editorlayout
Editorlayout
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
joggel

Re: [Qt] Fenster Layout

Beitrag von joggel »

Ja, das war auch meine Idee...
Die Toolbar mit setMinSize und setMaxSize festzulegen.
Der Rest müsste dann das Layout machen.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2398
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Qt] Fenster Layout

Beitrag 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
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 4886
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [Qt] Fenster Layout

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Matthias Gubisch
Establishment
Beiträge: 472
Registriert: 01.03.2009, 19:09

Re: [Qt] Fenster Layout

Beitrag 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
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: [Qt] Fenster Layout

Beitrag 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).
Benutzeravatar
Jonathan
Establishment
Beiträge: 2398
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Qt] Fenster Layout

Beitrag 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.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Antworten