Seite 1 von 1

[Gelöst] Wie ermittel ich die Position eines Widgets?

Verfasst: 5. September 2010 20:27
von qtimho
Hallo,

ich lerne gerade für mich selbst Qt und stehe leider ein bisschen auf dem Schlauch. Vielleicht habe ich auch einfach ein Brett vor dem Kopf:

Ich will die Position eines Textlabels ermitteln. Ich weiß, dass jedes Widget eine (relative) Position innerhalb seines Parent-Widgets hat, und dass man diese mit der Funktion pos ermitteln kann. Ich werde leider aus der Qt Reference Documentation nicht ganz schlau. Kann mir jemand an einem kurzen Beispiel zeigen, wie man die Position eines Textlabels mittels pos ermittelt und mit der Funktion move verschiebt?

Das wäre super. Vielen Dank.

Verfasst: 5. September 2010 20:39
von franzf
Um einem möglicherweise unnötigen Versuch, selber die Position/Größe der WIdgets beim Resizen zu verwalten, entgegen zu wirken: Verwende Layouts! Hangel dich in der Doku durch QLayout und abgeleitete Klassen, auch in den Examples wirst du einige Beispiele finden.
Wenn du keine Layouts suchst, sondern mehrere Unterfenster managen willst, ist evtl. QMdiArea interessant. Ansonsten gibt es immer noch das Qt GraphicsView Framework.

Ansonsten: Koordinatenursprung ist links oben. pos()-Angaben beziehen sich auf das linke obere Eck des jeweiligen Widgets. Damit sollte doch alles klar sein, oder? move() verschiebt das Fenster an eine neue Position.

Wenn dich das alles nicht weiterbringt, kannst du ja mal erklären, was du genau planst, dann kann man eine gute Lösung für dich finden :)

Verfasst: 5. September 2010 20:58
von qtimho
franzf hat geschrieben:Wenn dich das alles nicht weiterbringt, kannst du ja mal erklären, was du genau planst, dann kann man eine gute Lösung für dich finden :)
Vielen Dank für die schnelle Antwort.

Ich plane ganz banal ein Textlabel in einem Fenster schrittweise von oben nach unten wandern zu lassen, wenn man einen Button drückt. Und ich will das in einen Slot umsetzen: Beim Klick auf den Button wird das Textlabel um 1 Pos. mit move() nach unten verschoben. Dann ermittelt pos die aktuelle Position des des Textlabelwidgets. Beim nächsten Klick auf den Button verschiebt move() das Label wieder um eine Position nach unten. Dazwischen soll das Widget mit repaint() neu gezeichnet werden.

Verfasst: 5. September 2010 21:03
von franzf
qtimho hat geschrieben:Ich plane ganz banal ein Textlabel in einem Fenster schrittweise von oben nach unten wandern zu lassen, wenn man einen Button drückt. Und ich will das in einen Slot umsetzen: Beim Klick auf den Button wird das Textlabel um 1 Pos. mit move() nach unten verschoben. Dann ermittelt pos die aktuelle Position des des Textlabelwidgets. Beim nächsten Klick auf den Button verschiebt move() das Label wieder um eine Position nach unten. Dazwischen soll das Widget mit repaint() neu gezeichnet werden.
Siehst du: beim nächsten mal gleich sagen was du vor hast :P
Du suchst ganz banal QPropertyAnimation! starte die Animation beim clicked() des Buttons. Setup der Animation solltest du mit der Doku hinbekommen :)

Verfasst: 5. September 2010 21:10
von qtimho
franzf hat geschrieben:Du suchst ganz banal QPropertyAnimation! starte die Animation beim clicked() des Buttons. Setup der Animation solltest du mit der Doku hinbekommen :)
OK, aber ginge das nicht auch so, wie ich das geplant habe? Es ist jetzt ja nur zum üben...

Bislang sieht mein Slot so aus:

Code: Alles auswählen


void Form1::wandern()
{
    int y;  
    
    textLabel1->setGeometry(10, y, 40, 20);
    textLabel1->move(10, y+1);
    repaint();

}
Wenn ich jetzt den Button drücke verschiebt sich das Textlabel um exakt 1 Position nach unten. Wenn ich den Button nochmal drücke, passiert gar nichts mehr.

[Edit:] Oh Mann, ich habs!

Code: Alles auswählen

void Form1::wandern()
{
    int y = ( textLabel1->pos()).y();  
    
    textLabel1->setGeometry(10, y, 40, 20);
    textLabel1->move(10, y+1);
    repaint ();
}
Häufig hilft es einfach, sein Problem jmd. anderes gegenüber zu formulieren, um auf die Lösung zu kommen. :lol:

Vielen Dank nochmal für die Hilfe.

Verfasst: 5. September 2010 22:07
von franzf
qtimho hat geschrieben:OK, aber ginge das nicht auch so, wie ich das geplant habe? Es ist jetzt ja nur zum üben...
Klar. Dazu brauchst du einen QTimer. Häng dich an das timeout()-SIGNAL. Im SLOT dann das Widget um eine vorgegebene Distanz verschieben.

Warum dein SLOT nicht funktioniert? Dein y ist erstmal gar nicht korrekt initialisiert, Default-Initialisierung kann alles mögliche sein. Dann setzt du immer fix eine Geometry und machst dann ein move um ein px nach unten. Das ist 1) verdammt wenig, und 2) ist das Widget am Ende da, wo es nach dem ersten Klick auch war.

Du kannst sowas gerne ausprobieren, um es einmal gesehen zu haben. Gilt für alles - eine eigene List, String, ... Wenn es aber in einem Projekt Anwendung findet, sollte man auf fertige Lösungen zurückgreifen. Die sind meistens besser ausgetestet und haben einen größeren Funktionsumfang ;)