2017-06-28 13 views
0

Ich möchte eine animierte Pfeilform-Schaltfläche anzeigen.Animation auf einem QPainterPath-Objekt

Um es zu zeichnen, erstelle ich eine Klasse, die QGraphicsObject erbt und die QPainterPath Klasse verwenden.

Ich zeichne es in QGraphicsScene und animiere es mit der Eigenschaft geometry, die in der MyArrow-Klasse definiert ist.

Sie können den gesamten Code finden Sie hier: https://github.com/TaiZzZ/arrowAnimation

Mein Problem ist folgendes:

Der Pfeil belebt (was bedeutet, es bewegt sich nach rechts und kommt zurück), aber gemalt bleibt während der Bewegung. Hast du eine Ahnung warum?

Ps: Ich habe das gleiche Verhalten mit QState Machine, so denke ich, das Problem kommt nur von der Art, wie ich meine Pfeile zeichnen.

habe ich versucht, zwei verschiedene Dinge:

  • die Bezier-Kurve in Zeile ändern, ist es das Problem nicht beheben.

  • Statt den Weg der Zeichnung, zog ich ein Rechteck (die boundingRect()) (So habe ich nur geändert drawPath(path)), und es funktioniert

So zu schließen, kommt der Fehler von QPainterPath .. . aber warum ?

EDIT:

Hier sind Bilder, mein Problem zu veranschaulichen:

Before the animation After the animation

Beachten Sie, dass es nicht mehr anti-alliased ist ...

+0

Was meinen Sie mit „bleibt gemalt während der Bewegung“? Beachten Sie auch, dass Ihr Github Repo unvollständig zu sein scheint - ich bekomme "WARNING: Fehler beim Finden von: mainwindow.ui", wenn ich 'qmake' starte. –

+0

In der Tat habe ich diese Datei vergessen, jetzt sollte es richtig funktionieren. "bleibt während der Bewegung gemalt" ist nicht sehr klar, aber ich weiß nicht, wie ich das Problem in Kürze erklären soll! Vielleicht ist die beste Option, Bilder zu haben, bitte sehen Sie sich die Bilder an. – TaiZzZ

Antwort

1

Das Problem ist eigentlich ganz einfach - Sie löschen nicht Ihre QPainterPath vor der Wiederverwendung.

Ihre Arrow Klasse hat ein Mitglied ...

QPainterPath arrow; 

und Ihre Arrow::paint Implementierung beginnt mit ...

arrow.moveTo(rect.right(),rect.center().y()); 
arrow.lineTo(rect.left(),rect.top()); 

jedes Mal Arrow::paint So ist es andere neue subpath genannt Hinzufügen zum QPainterPath. Zu jedem Zeitpunkt sehen Sie also die akkumulierten Pfade. Die einfachste Lösung wäre es, die arrow Membervariable zu entfernen und verwenden eine lokal QPainterPath ...

scoped
QPainterPath arrow; 
arrow.moveTo(rect.right(),rect.center().y()); 
arrow.lineTo(rect.left(),rect.top()); 
Verwandte Themen