[gelöst] Rückgabe der Widgetgröße

Verschiedenes zu Qt
Antworten
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

[gelöst] Rückgabe der Widgetgröße

Beitrag von Exasperation »

Hallo zusammen!

Ich bastel mir gerade nen kleinen Favoritenmanager, in dem man Shortcuts zu all seinen Lieblingsprogrammen und Dateien anlegen kann.
Im Moment bin ich an der Positionierung dieses Programms welches aus einem QMenu besteht. Dazu muss ich unter anderem die Größe des Widgets abfragen, aber ich werd nicht ganz schlau...

Da bei der Positionierung so manches mal ein seltsames Ergebnis rauskam, hab ich mir beim durchdebuggen einfach mal die Breite und die Höhe des Widgets zurückgeben lassen. Also im Konstruktor meines von QMenu abgeleiteten Widgets mit width() und height(). Naja das Menü ist so circa 80 - 100 Pixel breit, beim durchdebuggen steht da allerdings ein Wert um die 640 Pixel drin. Das gleiche mit der Höhe, die ist etwa 480 und.... hmm moment... da fällt mir auf: Die Größe des Menus wird mit 640 auf 480 angegeben. Wie kann das sein? Ich habe mich an diesem Teil der Doku orientiert, deswegen verwirrt es mich dass ich 640 und 480 Pixel an Breite und Höhe zurückgegeben bekomme.

Noch zur Info: Das QMenu ist Anfangs bis auf einen Eintrag "Manage Favorites" leer, wird dann mit Actions aus einer DB gefüllt. Danach frage ich Höhe und Breite ab und bekomme diese 640 auf 480, von denen ich nur 400 auf 100 sehe. Eben so, wie so ein Menu nunmal aussieht.

Was hab ich da bei der Widget-Geometry falsch verstanden?

Anhang: Screenshot
Dateianhänge
Unbenannt.PNG
Unbenannt.PNG (21.31 KiB) 3737 mal betrachtet
Zuletzt geändert von Exasperation am 2. August 2010 12:55, insgesamt 3-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Rückgabe der Widgetgröße

Beitrag von solarix »

Exasperation hat geschrieben: Da bei der Positionierung so manches mal ein seltsames Ergebnis rauskam, hab ich mir beim durchdebuggen einfach mal die Breite und die Höhe des Widgets zurückgeben lassen. Also im Konstruktor meines von QMenu abgeleiteten Widgets mit width() und height(). Naja das Menü ist so circa 80 - 100 Pixel breit, beim durchdebuggen steht da allerdings ein Wert um die 640 Pixel drin. Das gleiche mit der Höhe, die ist etwa 480
Der CTor ist ein schlechter Platz für solche Initialisierungen, weil da das Layout noch nicht fertig gerendert wurde. Du bist daher schlicht und einfach zu früh dran mit solchen Abfragen.
Siehe:
http://www.qtforum.de/forum/viewtopic.php?t=7715

hth..
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Schonmal danke für die Info. Naja das komische ist, dass ich diese Abfrage als allerletztes im C'tor mach, vorher werden in versch. Funktionen die Actions festgelegt. Dann soll in Abhängigkeit von der Größe des Widgets die Position berechnet werden.

Zur Erklärung: Standardmäßig geht das Menü wie ein Start- oder Kontextmenü am Mauszeiger auf. Ragt es allerdings über den Bildschirm Rand hinaus soll, es entsprechend neu positioniert werden, wie man es von anderen Menüs auch kennt.

Ich schau mir den anderen Thread mal an. :)
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Ein kleiner Test hat Klarheit gegeben :)

Hab einfach mal in meiner main funktion nach dem Anlegen meines Menüs auf dessen Größen zugegriffen und siehe da: Da kommen 162 auf 414 Pixel raus.

Merke: Ein Widget ist erst konstruiert wenn der Kontruktor wirklich fertig konstruiert hat. :)

/EDIT: Hab die automatische Positionierung meines Widgets jetzt fertig implementiert und ein bisschen getestet und dabei stellte sich heraus, dass erst mit dem Aufruf von show() die endgültige Größe des Widgets berechnet wird. Ab sofort kann man Menu damit nicht mehr über den Bildschirmrand lappen :)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Im übrigen steht im polish-Event auch schon die Größe fest.
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Danke für die Info, schau ich mir auch noch an!
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Ich versuche jetzt beim Aufruf des polish events mit der dann vorhandenen Größe meine Positionen zu berechnen.

Code: Alles auswählen

bool main_window::event( QEvent * e )
{
	int res = QWidget::event( e );

	if( e->type() == QEvent::Polish )
	{
		set_position( width(), height() );
		return true;
	}
	
	return res;
}
Allerdings wird da dann wieder seltsames übergeben. 480 und 800. Wenn ich die Größe nach meinem show() abfrage sind es aber die korrekten 162 auf 416.
Antworten