GridLayout selbst erstellen, wie die Größe bestimmen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hallo Leute,
ich hab erst angefangen mit GUI Programmierung und hab bei ein paar Sachen ein Verständnisproblem... Vielleicht kann mir da Jemand helfen, und sagen wie man es richtig oder am geschicktesten macht...

Ich habe zur Zeit mehrere Center Widgets, die alle eine unterschiedliche Anzahl an Gridrows haben. Ich will das in Zukunft noch auf StackedWidgets umbauen, aber das hab ich nocht nicht gemacht.

Ich hab jetzt mein Fenster jetzt einfach mal eine Größe von 500px gegeben und das ist für mein größtes Formular auch super. Wenn ich aber ein Formular wähle, das nur aus einem Textfeld und ner Überschrift besteht, dann ist das immer an den unteren Rand geklatscht. :K
Ich würde erwarten, das es oben anfängt und unten dann einfach Leerraum ist.

Ich versteh im Moment noch nicht, wie ich die größe meines Widgets bestimme. Muss ich die größe meines Mainwindows immer anpassen? Oder was macht man mit ungenutzten Platz?

Ich benutze keinen Designer oder sowas, versuche solche Dinge irgendwie immer per Hand hin zu bekommen, aber ich glaube im Moment fehlt es einfach an dem Verständnis, was ich mit den unterschiedlich großen Widgets machen soll.

Würde mich über ein paar Tipps sehr freuen.
BlackJack

@würmchen: Es schwierig etwas zu handgeschriebenem GUI-Layout zu sagen und warum das so aussieht wie es aussieht wenn man das Aussehen nur vage beschrieben bekommt und den Quelltext nicht kennt. :-)

Wenn man wahlweise verschiedene Widgets am selben Platz in der GUI anzeigen möchte, dann sollte man ein entsprechendes Containerwidget verwenden, damit das den (grössten) benötigten Platz aus den Inhalten selber ableiten kann und man nicht absolute Vorgaben machen muss, mit den üblichen Problemen die dabei entstehen. Dann sollte der freie Platz bei kleineren, enthaltenen Widgets auch dort sein, wo der Anwender ihn üblicherweise erwartet.

Beim Entwickeln kann es manchmal helfen mit Hintergrundfarben bei Widgets zu arbeiten. Ab und zu gehören Abstände und Ähnliches nicht zu dem Widget von dem man es vermutete, oder Widgets sind nicht so verschachtelt wie man glaubte. Dem kann man so auf die Spur kommen.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Ja, Containerwidget ist quasi genau das was ich brauche :-)


Im Moment geh ich gerade den Umstand und lass mir für jedes Label und so mit sizeHint() die höhe ausgeben und definiere dann in mit setFixedSize() die Größe neu, aber das ist einfach nicht schön :-)

Ich such eben nach einer Funktion, dass die minimalen Abmessungen von meinem Widget zurück gibt. Und dann könnte ich das Mainwindow resizen. Allerdings hab ich das schon mal versucht, und da ging es zwar größer zu machen, aber nicht wieder kleiner... Beim größer machen hatte ich das Problem, dass wohl die Formularfelder nicht neu gezeichnet werden und ich erst noch mal per Hand die Größe ein wenig ändern muss, dann sind auf einmal alle Felder zu sehen...
Ich kann den Code mal online stellen, aber ich weiß nicht ob man sich in den 400 Zeilen zurecht findet...

Danke aber auf jeden Fall für Dein Feedback BlackJack!



[EDIT]

Hm, ok, ich denke ich hab eine Funktion gefunden, die mir mein centerWidget immer richtig darstellt...

Code: Alles auswählen

self.setFixedSize(QtCore.QSize(500,grid.totalSizeHint().height()))
Somit gebe ich eine feste Breite von 500 an und bekomme die Höhe meines Widgets und trage die als Höhe ein.
Lediglich die Größe meines QMainWindow kann ich nicht verkleinern. Gibt es da ein Trick?
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hm, ich glaub jetzt kapiere ich auch gerade den Vorteil von StackedWidgets... Wenn ich ein Stack von den Widgets mache, dann kann ich die maximale Größe bestimmen und kann mein Mainwindow zumindest der maximalen Größe anpassen... Im Moment hab ich es nur ungefähr gesetzt, so das er nirgends vergrößern muss....
BlackJack

@würmchen: Um Himmels willen hör auf eigene Layoutmechanismen zu programmieren. Das ist kompliziert und fehleranfällig und vor allem unnötig, denn Qt bringt schon alles Nötige mit.

Das Hauptfenster würde ich nicht laufend dynamisch dem Inhalt anpassen, allerhöchstens wenn es grösser werden muss um den Inhalt darstellen zu können. Und wenn dann würde ich das dem GUI-Toolkit überlassen.

Du musst bei Problemen ja kein Riesenprogramm zeigen. Es reicht ein kleines Beispiel das lauffähig ist und das Problem illustriert.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

BlackJack hat geschrieben:@würmchen: Um Himmels willen hör auf eigene Layoutmechanismen zu programmieren. Das ist kompliziert und fehleranfällig und vor allem unnötig, denn Qt bringt schon alles Nötige mit.
Hatte ich auch nicht gewollt, aber durch das ganze vererben und unzählige Möglichkeiten, die man durch Qt hat, hab ich einfach keine Funktion gefunden, die mir die Größe meines Widgets sagt,

Code: Alles auswählen

totalSizeHint
macht das aber scheinbar ganz gut.


Jetzt wird auch der Inhalt nicht mehr über die komplette Höhe des MainWidgets verteilt sondern ist schön kompakt beisammen am oberen Rand... Bin jetzt zufrieden, nur mit den StackedWidgets, das will ich noch ändern, dann wäre ein resize des MainWidgets garnicht nötig. Danke für die Hilfe
BlackJack

@würmchen: Wenn Du kein eigenes Layout programmieren willst, dann brauchst Du auch keine Funktion, die Dir die Höhe eines Widgets ermittelt.

Das Verteilen des Grids über den verfügbaren Platz sollte man in den Griff bekommen in dem man einen vertikalen Spacer verwendet, der den zusätzlichen Platz „verbraucht”.
Antworten