halflings
halflings

Reputation: 1538

Animating a custom QGraphicsItem with QPropretyAnimation

I want to make a car follow a path, so I tried animating a custom QGraphicsItem (describing a 'car') using QPropreties, starting by an example given on PySide documentation :

  self.anim = QtCore.QPropertyAnimation(self.car, "geometry")
  self.anim.setDuration(4000);
  self.anim.setStartValue(QtCore.QRect(0, 0, 100, 30));
  self.anim.setEndValue(QtCore.QRect(250, 250, 100, 30));
  self.anim.start();

self.car here is an instance of Car, a class that inherits from QGraphicsItem and QObject ( EDIT Changed this, see EDIT 2):

class Car(QtGui.QGraphicsItem, QtCore.QObject):

        def __init__(self, map = None, ....):

            super(Car, self).__init__()
            self.map = map
                    ....

I always get the same error code when executing this :

  QPropertyAnimation::updateState (geometry): Changing state of an animation without target

This is weird as the target is really set ! I tried putting setTargetObject ( see the documentation on PySide ) but it didn't change anything.

Any idea about where that could come from ?

EDIT : Something that could help -> I tried putting those three lines and the result shows that the object is not taken into account :

  print self.car
  self.anim.setTargetObject(self.car)
  print self.anim.targetObject()

Result

<engine.Car(this = 0x43f9200 , parent = 0x0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ItemIsMovable | ItemIsSelectable ) )  at 0x1de0368>
None

EDIT 2 : Changing the class inheritance to QGraphicsObject seems to have solved the 'no target' problem ! But I have a different error now (using a custom defined property 'pos'):

  QPropertyAnimation::updateState (pos, Car, ): starting an animation without end value

I defined my property that way :

def setPos(self, pos):
    self.x = pos[0]
    self.y = pos[1]
    self.update()

def readPos(self):
    return (self.x, self.y)

pp = QtCore.Property('tuple', readPos, setPos)

Upvotes: 0

Views: 2589

Answers (2)

halflings
halflings

Reputation: 1538

The solution was to first change the inheritance from QGraphicsItem and QObject to QGraphicsObject. Then, the second error I did is I didn't define my property (x and y) correctly.

I ended up re-implementing my class to use QGraphicsObject's "pos" property and give it the correct start and end value (tuples).

Upvotes: 1

D K
D K

Reputation: 5750

If you just need to animate position, you can animate GraphicsItem.pos rather than defining your own position functions (unless you want the car to have a position within the QGraphicsItem itself.

As for 'starting an animation without end value', make sure you:

  1. Call setEndValue on the animation.
  2. Pass in the correct type to setEndValue (e.g. your current implementation would require a tuple, using GraphicsItem.pos would require a QPoint).

Upvotes: 2

Related Questions