2013-03-31 5 views
0

Я хочу, чтобы сделать автомобиль следовать по пути, так что я попробовал анимировать обычай QGraphicsItem (с описанием в «автомобиль») с использованием QPropreties, начиная с помощью примера, приведенного на PySide документации:Анимационные пользовательский QGraphicsItem с QPropretyAnimation

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 здесь является экземпляром автомобиля, класс, который наследует от QGraphicsItem и QObject (EDIT Изменено этом см 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 (см. documentation on PySide), но ничего не изменил.

Любая идея о том, откуда это может произойти?

EDIT: Что-то, что может помочь -> Я попытался положить эти три строки и результат показывает, что объект не принимается во внимание:

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 

EDIT 2: Изменение наследования класса на QGraphicsObject, похоже, решил проблему «без цели»! Но у меня другая ошибка сейчас (с помощью настраиваемого определено свойство «поз»):

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) 
+0

'QGraphicsItem' не имеет атрибута геометрии.Вы, вероятно, хотите либо анимировать 'boundingRect' (который, как я считаю, невозможен), или какое-либо другое свойство, которое вы создаете сами, которое контролирует, насколько большой вы рисуете автомобиль. –

ответ

1

Решение было сначала изменить наследство от QGraphicsItem и QObject к QGraphicsObject. Тогда вторая ошибка, которую я сделал, - это не правильно определить мое свойство (x и y).

Я закончил тем, что повторно использовал свой класс для использования свойства QGraphicsObject «pos» и дал ему правильное начальное и конечное значение (кортежи).

+0

Вы знаете, почему наследование с QGraphicsItem и QObject было плохим? Что не так с определением свойства. Я наткнулся на ту же ошибку и хотел ее решить. – Adrian

+0

На самом деле QGraphicsObject - это просто QGraphicsItem + некоторые сигналы и свойства. (поскольку он уже наследует от QObject и определяет правильные свойства для вращения, положения и т. д.). Из документации Qt: «Класс QGraphicsObject предоставляет базовый класс для всех графических элементов, которым требуются сигналы, слоты и свойства». – halflings

2

Если вам просто нужно анимировать позицию, вы можете анимировать . GraphicsItem.pos, а не определять свои собственные функции позиции (если вы не хотите автомобиль, чтобы иметь место в самой QGraphicsItem

Что касается 'starting an animation without end value', убедитесь, что вы:

  1. Звоните setEndValue на анимацию.
  2. Передайте правильный тип setEndValue (например, для вашей текущей реализации потребуется кортеж, с использованием GraphicsItem.pos потребуется QPoint).
+0

Спасибо, пытаясь получить это исправление, я заметил, что во всем GraphicsItem (и, следовательно, GraphicsObject) уже есть свойство «pos». Я переопределял свой класс, используя атрибут native position, и он, наконец, анимирован! (к сожалению, анимация странная, есть смещение на значения позиции ... но я, должно быть, что-то испортил, переопределяя мой класс). Благодаря ! – halflings

Смежные вопросы