Seite 1 von 1

Animationsgeschwindigkeit

Verfasst: 11. April 2013 21:35
von marcel87
Hallo!

Ich bin gerade dabei einen QPushButton zu animieren, also dieser soll sich nach einem Klick zu einer Position bewegen.
Dies funktioniert soweit bei mir gut.

Hier ist der Ausschnitt aus meinem MainWindow.

Code: Alles auswählen

{   
// Zuerst wird eine neue Animation erzeugt
QPropertyAnimation*animation= new QPropertyAnimation(ui->Button, "geometry");
   
    //Hier wird eine fixe Zeit eingestellt
    animation->setDuration(5000); //ungeeignet, da die Zeit fix ist 

    // Die Endposition und die Endgröße wird hier bestimmt 
    QRect endposition(40,500,100,100);

    // An dieser Stelle wird der EndValue gesetzt und die Animation gestartet
    animation->setEndValue(endposition);
    animation->start();
}
Das Problem dabei ist, dass bei meiner Bewegung hier die Zeit fix ist (logisch, wegen Duration).
Ich möchte jedoch, dass ich eine fixe Geschwindigkeit habe, also sowas wie "setVelocity" anstelle von "setDuration".
Auf dieser Seite (http://qt-project.org/doc/qt-4.8/q3canv ... tXVelocity) bin ich erfolglos unterwegs.

Kann da jemand einen konstruktiven Tipp geben oder eben eine Seite zu solcher Problematik geben?

Allgeimeine informationen: Ich nutze Qt 5.0.1

Re: Animationsgeschwindigkeit

Verfasst: 12. April 2013 08:30
von DBGTMaster
Aus der Geschwindigkeit kannst du wiederrum die Zeit ausrechnen, oder?

Re: Animationsgeschwindigkeit

Verfasst: 12. April 2013 09:03
von marcel87
Hallo!

Ne, so funktioniert das nicht. Die Sache ist die: Man hat die aktuelle Position des QPushButtons und seine Endpositon. Diese Endposition kann egal wo sein, solange man z.B. 5 Sekunden der Animation für die Erreichung der Endposition gegeben hat. Das bedeutet egal wohin sich der QPushButton bewegen soll, er erreicht dies immer unter der vorgegebener Zeit (also 5s). Die Geschwendigkeit variiert dabei, abhängig von der Entfernung. Das will ich eben andersrum haben.

Ich möchte eben eine fixe Geschwindigkeit haben und die Zeit sollte je nach Entfernung variieren.
Ich glaube dies lässt sich nicht durch QPropertyAnimation umsetzen aber wie gesagt, an dieser Stelle komme ich nicht weiter.

Re: Animationsgeschwindigkeit

Verfasst: 12. April 2013 09:10
von DBGTMaster
Du könntest den Abstand von Startposition und Endposition errechnen, und darauf dann die Geschwindigkeit.

Re: Animationsgeschwindigkeit

Verfasst: 13. April 2013 00:41
von veeman
Wie schon DBGTMaster sagte kannst du die Zeit selbert berechnen, zur Vereinfachung könntest du deine eigene Klasse implementieren:
1. QPropertyAnimation ableiten
2. setDuration als protected (privat) deklarieren
3. deine setVelocity Funktion implementieren
4. start-Methode überschreiben
4. Und beim Aufruf dieser anhand des Abstandsvektors dir die Zeit setzen und anschließend die Animation starten

Re: Animationsgeschwindigkeit

Verfasst: 14. April 2013 21:43
von marcel87
Hallo!

Danke für die Antwort, ich versuche dies dann umzusetzen.

Re: Animationsgeschwindigkeit

Verfasst: 16. April 2013 16:09
von Mr.Crank
Ein Ansatz wäre sicher auch noch die Duration direkt im Klammerterm abhängig von der geometry zu berechnen.
Spricht du legst dir Variablen an , von mir aus int x_start=0,int x_end=0; und int y_start=0,int y_end=0; ind den
speicherst du die geometry daten der Start und Endposition. Die Differenz der von x_start zu x_end und selbiges
für y ist ein Maß für deine Entfernung.(ggf. überprüfen welcher der größere Wert ist und von dem immer subtrahieren
um negativ Werte zu vermeiden). In animation->setDuration(Festerwert * Differenzenwert), so sollte es auch einfacher
gehen. Den Differenzwert solltest du als Resultierende errechnen ( Mathe und Mechanik lässt grüßen ;P )
float dif_wert=Wurzel aus dif_x²+dif_y² ; ( so kannst du dir sogar die < > Abfrage sparen ;) )

Hoffe es hilft Dir weiter ;D

Re: Animationsgeschwindigkeit

Verfasst: 27. April 2013 14:11
von marcel87
Hallo!

Danke für die Tipps. Mathe und Mechanik ist kein Problem^^.

Das Problem liegt in der Umsetzung, nicht in der Theorie. Bei mir fängt es gerade so an zu funktionieren (wie ich es gerne haben möchte).