Seite 1 von 1
hide widget und Grösse
Verfasst: 20. November 2008 17:11
von osiris81
Hallo,
in einem Widget ist eine Groupbox die mehrere Labels enthält. Die Labels haben alle eine fixierte Grösse ( setFixedSize(...) ). Im Normalfall lässt sich die Groupbox durch Verkleinern meines Fensters nur so lange verkleinern, bis die Labels gerade noch darin Platz haben (ist ja so gewollt). Sind meine Lables jedoch anfänglich "hidden" ( hide() oder setVisible(false) ) so kann ich die GroupBox weiter verkleinern.
Wie kann ich das Label unsichtbar machen, ohne dass meine Goupbox die Grösse dabei ändert?
Danke für jede Hilfe!
Osiris
Verfasst: 20. November 2008 17:28
von upsala
QStackedWidget und ein zusätzliches leeres Widget verwenden.
Verfasst: 20. November 2008 17:40
von osiris81
Hi,
Vielen Dank erstmals!
Wenn ich nun aber 10 Labels in der GroupBox habe, muss ich dann jedes einzelne in ein QStackedWidget packen mit einem zusätzlichen leeren Widget?
Das scheint mir etwas aufwändig und der Code für andere nachher wahrscheinlich auch etwas unverständlich...
Verfasst: 20. November 2008 18:20
von upsala
Dann verwende halt setDisabled
Re: hide widget und Grösse
Verfasst: 21. November 2008 07:12
von macman
osiris81 hat geschrieben:Wie kann ich das Label unsichtbar machen, ohne dass meine Goupbox die Grösse dabei ändert?
GroupBoxen haben auch ein setMinimumSize(...).
Re: hide widget und Grösse
Verfasst: 21. November 2008 09:27
von osiris81
Danke für die neuen Vorschläge, bin leider immer noch nicht überzeugt:
macman hat geschrieben:
GroupBoxen haben auch ein setMinimumSize(...).
Habe ich bereits probiert, wenn ich allerdings die Höhe des Labels als MinimumSize setze, dann ist die Groupbox viel zu klein (die minimumSize bezieht sich ja auf die Grösse der Box selber, nicht den Platz darin) also müsste ich noch irgendeine Zahl (die bestimmt abhängig des Aussehens der Box ist) dazuzählen...
upsala hat geschrieben:Dann verwende halt setDisabled
Das macht das Label nicht unsichtbar.
Re: hide widget und Grösse
Verfasst: 21. November 2008 09:37
von macman
osiris81 hat geschrieben:wenn ich allerdings die Höhe des Labels als MinimumSize setze, dann ist die Groupbox viel zu klein (die minimumSize bezieht sich ja auf die Grösse der Box selber, nicht den Platz darin) also müsste ich noch irgendeine Zahl (die bestimmt abhängig des Aussehens der Box ist) dazuzählen...
Verstehe ich jetzt nicht so ganz. Wenn deine Label alle eine feste Größe haben, dann kannst Du doch die Mindestgröße der Box berechnen. Margin und Spacing des Layouts sollte man nicht vergessen.
Re: hide widget und Grösse
Verfasst: 21. November 2008 10:36
von osiris81
macman hat geschrieben:
Verstehe ich jetzt nicht so ganz. Wenn deine Label alle eine feste Größe haben, dann kannst Du doch die Mindestgröße der Box berechnen. Margin und Spacing des Layouts sollte man nicht vergessen.
Auch mit Margin (Spacing brauche ich doch nicht, da die Labels nebeneinander sind und ich nur die Höhe der GroupBox setzen müsste) des Layouts stimmt die Höhe nicht, die GroupBox hat ja innerhalb noch einen Rand mit der Beschriftung, das braucht auch Platz. Ich habe die Höhe nun wie folgt berechnet:
Code: Alles auswählen
ui.groupBox->setMinimumHeight(
ui.label->height()
+ ui.groupBox->layout()->margin()
+ ui.groupBox->frameSize().height()
);
Dies stimmt allerdings auch nicht, so ist die GroupBox etwas zu hoch...
Dass man in Qt4 nicht einfach ein Label unsichtbar machen kann ohne dass sich das gesamte Layout verzieht finde ich schon etwas bedenklich..
Verfasst: 21. November 2008 10:45
von osiris81
Hier noch ein Beispiel wie sich das Problem äussert (vorerst nur ein Label)
Links: Label sichtbar
Rechts: Label unsichtbar
Unten: Layout
Re: hide widget und Grösse
Verfasst: 21. November 2008 11:16
von macman
Wenn Du mit Spacern arbeitest, kannst Du auch noch vertikale Spacer einfügen. SizeTyp auf MinimumExpanding und SizeHint auf passende Höhe.
osiris81 hat geschrieben:Dass man in Qt4 nicht einfach ein Label unsichtbar machen kann ohne dass sich das gesamte Layout verzieht finde ich schon etwas bedenklich..
Das ist der Sinn eines Layoutmanagers. Ist ja nicht so, das man das hinnehmen muss. Es gibt schon Möglichkeiten Größenbegrenzungen festzulegen.
PS: Nächstes Mal die Bilder bitte in HD, damit sie garantiert nicht mehr auf meinen Monitor passen

Verfasst: 21. November 2008 13:04
von osiris81
Danke nochmals. Das mit dem SpacerItem funktioniert für meinen Fall.
Nun gibt es aber bereits das nächste Problem: An einer anderen Stelle wird die ganze GroupBox auf hidden gesetzt. Die GroupBox kann auch in einem Layout sein und ich könnte auch ein SpacerItem hinzufügen, nur leider weiss ich die Höhe der GroupBox nicht und der Wert von ui.groupBox->height() stimmt erst dann, wenn die GroupBox sichtbar ist (in meinem Beispiel dann 84, und vorher 30)...
Hier vielleicht noch eine Idee?
Verfasst: 21. November 2008 13:35
von macman
Verstehe ich das richtig, Du willst die obere Groupbox verstecken und stattdessen leeren Raum im Dialog lassen?
Verfasst: 21. November 2008 16:04
von osiris81
macman hat geschrieben:Verstehe ich das richtig, Du willst die obere Groupbox verstecken und stattdessen leeren Raum im Dialog lassen?
Ja, das verstehst Du genau richtig!
Das Besipiel hier ist nicht sinnvoll, es soll nur das Problem verdeutlichen. Die richtige GroupBox ist innerhalb einer anderen GroupBox.
Verfasst: 22. November 2008 08:47
von macman
Ich hatte mal ein ähnliches Problem und musste da mit SizePolicy und dynamischen Min/Max-Werten arbeiten. Ist etwas Fummelei, geht aber

Verfasst: 24. November 2008 14:00
von Hulk2442
osiris81 hat geschrieben:macman hat geschrieben:Verstehe ich das richtig, Du willst die obere Groupbox verstecken und stattdessen leeren Raum im Dialog lassen?
Ja, das verstehst Du genau richtig!
Das Besipiel hier ist nicht sinnvoll, es soll nur das Problem verdeutlichen. Die richtige GroupBox ist innerhalb einer anderen GroupBox.
Erzeuge ein QWidget mit einer fixen Grösse!
Diesem teilst du eine QLayout zu.
Dem QLayout widerum die QGroupBox.
Nun kannst du die Box hidden und der Platz bleibt gleich da in diesem Fall das Widget diesen in anspruch niemt.