2013-03-31 113 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這裏是汽車的一個實例,從QGraphicsItemQObject繼承的類(編輯改變了這種見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),但它沒有改變任何東西。

任何想法可能來自哪裏?

編輯:的東西,可以幫助 - >我試圖把這些三線,結果表明該對象沒有考慮到:

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

'QGraphicsItem'沒有幾何屬性。你可能想要爲'boundingRect'(我認爲是不可能的)或者你自己創建的一些其他屬性(它控制你繪製汽車的大小)創建動畫。 –

回答

1

的解決方案是第一繼承從QGraphicsItemQObject更改爲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

謝謝,雖然試圖讓這個固定我注意到已經有一個「pos」屬性在所有GraphicsItem(因此GraphicsObject)。 我用原生位置屬性重新實現了我的類,並且它終於動畫了! (不幸的是,動畫很奇怪,位置值有偏移......但是當我重新實現我的課程時,我一定會搞砸了)。謝謝 ! – halflings