Seite 1 von 1

QSlider mit QPropertyAnimation connecten?

Verfasst: 13. Juni 2010 14:29
von Himbeer-Toni
Hallo liebe Foren-Community,

mein Animationsprojekt schreitet voran und inzwischen laufen alle Animationen so, wie ich es gerne hätte. Es wäre allerdings schön, wenn ich den zeitlichen Fortschritt meiner Animation mit einem QSlider als Zeitleiste visualisieren könnte. Außerdem wäre es toll, wenn man mit Bewegen des Sliders die Animation vor- und zurückspulen könnte.

Die Animationen laufen bereits und können bisher über einen Start-, Stop- und Pausebutton gesteuert werden. Ein Slider ist auch schon vorhanden, jedoch bisher leider ohne Funktion, da mir einfach nicht klar ist, wie ich das ganze connecten soll. Der Slider nimmt nur Zahlen von 0 bis 100 (int) an, während der Animationsfortschritt meines Wissens nach Werte zwischen 0 und 1 annimmt.

Hier ein verknapptes Beispiel:

Code: Alles auswählen

QScene Scene;
Scene.addItem(Ball);

QGraphicsView View(&Scene);

QPropertyAnimation AniPosition(Ball, "pos");
AniPosition.setDuration(5000);
AniPosition.setStartValue(QPointF(0,0));
AniPosition.setEndValue(QPointF(200,200));

QSlider SlideBar = new QSlider(Qt::Horizontal, this);
Nun stellt sich mir die Frage nach den Connections:

Code: Alles auswählen

connect(&AniPosition, SIGNAL(?), SlideBar, SLOT(?));
connect(SlideBar, SIGNAL(?), &AniPosition, SLOT(?));
Bin ich überhaupt auf dem richtigen Weg? Für Hilfe, Tipps und Anregungen bin ich dankbar.

Einen schönen Sonntag!

Viele Grüße
Toni

Verfasst: 13. Juni 2010 16:32
von -=Freaky=-
vielleicht
- das valueChanged-signal der QPropertyAnimation mit einem eigenen slot connecten
- da dann das QSlider-value setzen (QVariant::toInt()) (in prozent umrechnen, oder QSlider minimum/maximum auf 0/1 setzen?)

- andersrum dann das valueChanged-signal vom QSlider mit einem eigenen slot verbingen, da mittels QPropertyAnimation::totalDuration() ausrechnen, an welchen zeitpunkt der animation beim gegebenen prozentwert (vom QSlider) gesprungen werden muss, und mittels QPropertyAnimation::setCurrentTime das dann auch tun
?

nur geraten, habs nie selbst gemacht, aber so wurde ich spontan, nach doku, es probieren.

mfg,
julian

Verfasst: 15. Juni 2010 17:54
von Himbeer-Toni
Ganz so einfach war es leider nicht, da das QVariant Signal vom Typ QPointF war, und somit keinen echten Bezug zur Zeit hatte. Trotzdem hab ichs lösen können, auch wenns vielleicht nicht der korrekte Weg ist :)

Code: Alles auswählen

connect(Scene.AniScaling, SIGNAL(valueChanged(QVariant)), this, SLOT(MoveSlider(QVariant)));
connect(SlideBar, SIGNAL(sliderMoved(int)), this, SLOT(MoveAnimation(int)));

void MainWindow::MoveSlider(QVariant Signal) {

    int SlideValue = (Scene.AniScaling->currentTime() * 100 / Scene.AniScaling->duration())%100;

    SlideBar->setValue(SlideValue);
}

void MainWindow::MoveAnimation(int Signal) {
    int Time = Scene.AniScaling->duration() / 100 * Signal;

    Scene.AniScaling->setCurrentTime(Time);
}
Danke für deinen Gedankenanstoß!