0

我想让汽车沿着路径行驶,所以我尝试使用 QPropreties 为自定义 QGraphicsItem(描述“汽车”)设置动画,从 PySide 文档中给出的示例开始:

  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这是 Car 的一个实例,它是一个继承自QGraphicsItemand的类QObject编辑更改了这个,请参阅EDIT 2):

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

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

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

执行此操作时,我总是得到相同的错误代码:

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

这很奇怪,因为目标确实设定了!我尝试放置 setTargetObject (请参阅PySide 上的文档),但它没有改变任何东西。

关于这可能来自哪里的任何想法?

编辑:可以提供帮助的东西->我尝试输入这三行,结果表明没有考虑到该对象:

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

结果

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

编辑 2:将类继承更改为QGraphicsObject似乎解决了“无目标”问题!但我现在有一个不同的错误(使用自定义属性'pos'):

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

我以这种方式定义了我的财产:

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)
4

2 回答 2

2

如果您只需要动画位置,您可以动画GraphicsItem.pos而不是定义自己的位置函数(除非您希望汽车在其QGraphicsItem自身中有一个位置。

至于'starting an animation without end value',请确保您:

  1. 调用setEndValue动画。
  2. 将正确的类型传递给setEndValue(例如,您当前的实现将需要一个元组,使用GraphicsItem.pos将需要一个QPoint)。
于 2013-03-31T12:21:13.010 回答
1

解决方案是首先更改继承 fromQGraphicsItemQObjectto QGraphicsObject。然后,我犯的第二个错误是我没有正确定义我的属性(x 和 y)。

我最终重新实现了我的类以使用QGraphicsObjectpos”属性并为其提供正确的开始和结束值(元组)。

于 2013-04-02T17:21:51.520 回答