Seite 1 von 1

Resizing + Höhe relativ zur Breite

Verfasst: 22. Oktober 2007 09:40
von romankreisel
Hallo allerseits,

seit längerer Zeit versuche ich (bisher leider mit wenig bis gar keinem Erfolg) ein Widget so einzustellen, dass die Höhe und Breite immer relativ zueinander sind.
Ergo: vergrössert man die Breite, so ändert sich die Höhe (nach einem festgelegten Faktor) auch. Hab dazu natürlich auch schon die heightForWidth() überschrieben und mit QSizePolicy und setHeightForWidth und hasHeightForWidth rumgespielt, aber es halt bisher alles nicht zum erfolg geführt.

Leider hab ich auch weder in der qt-Doku, noch hier im Forum existierenden Code gesehen, der sich dieses Problem behandelt.


Ich würde mich um eine Antwort, sei es auch nur eine Referenz wo man Beispielcode finden kann, sehr freuen.


Gruß
Roman

Verfasst: 26. Oktober 2007 11:15
von macman
Damit wenigstens einer antwortet :-) Ungefähr so:

Code: Alles auswählen

void myWidget::resize( int w, int h )
{
	if (w > h)
		w = h;
	else if (w < h)
		h = w;

	setGeometry(x(), y(), w, h);
}
Aber wahrscheinlich hast Du es inzwischen selbst heraus bekommen.

Verfasst: 26. Oktober 2007 12:02
von Sephral
Hallo,

als mit "einstellen" hab ich es auch nicht geschafft.

Ich musste letztendlich QWidget::resizeEvent(...) überschreiben und dort dafür sorgen, dass das richtige Seitenverhältnis gesetzt wird, damit klappte es dann aber auch.

Ciao,
Sephral

Verfasst: 29. Oktober 2007 09:37
von romankreisel
hab soeben mal resizeEvent überschrieben, jedoch ergibt sich daraus keine positive Änderung (einzige Änderung die mir auffält: er ignoriert natürlich mein "hasHeightForWidth", ist auch klar, ich hab ja was dies betrifft nicht den alten code reimplementiert)

Mal davon abgesehen sagt die Qt-Doku aus, dass eine Änderung der "geometry"-Eigenschaft ein resizeEvent auslöst. Ich denke die Gefahr ist nicht gering, dass man hierbei in einer endlosschleife endet.


Gruß
Roman

Verfasst: 29. Oktober 2007 09:39
von Sephral
Mit der Eindlosschleife hast du recht, kann man aber durch ein Flag umgehen das du setzt, wenn die letzte Änderung von Deinem Code ausgelöst wurde. Kommt ein Resize-Event und das Flag ist aktiv, dann wird das Event ignoriert.

Ich weiß, ist kein schöner Code, aber es funktioniert :-)


Ciao,
Sephral

Verfasst: 29. Oktober 2007 09:40
von romankreisel
Nachtrag:
ein Hübscher satz aus http://doc.trolltech.com/3.3/qwidget.html#geometry-prop:
Warning: Calling setGeometry() inside resizeEvent() or moveEvent() can lead to infinite recursion.