2012-07-29 40 views
0

我有問題,我想爲我自己的類繼承由QGraphicsPixmapItem設置Q_PROPERTY宏。所以我第一個屬性,我設置位置工作得很好,但第二個我想爲Qt :: YAxis設置旋轉的屬性不起作用,我不知道如何正確編寫它。我需要這些特性來製作動畫。以下是我嘗試:QTransform :: setRotation與Q_PROPERTY

--Ah--

class myOwnPixmapItem : public QObject, public QGraphicsPixmapItem 
{ 
    Q_OBJECT 
    Q_PROPERTY (QPointF pos READ pos WRITE setPos) 
    Q_PROPERTY (QTransform rot READ rot WRITE setRotation) 

public: 
    flowNpixmapItem() 
}; 

--A.cpp--

myItemPosAnim -> setTargetObject (myItem); 
myItemTransAnim -> setTargetObject (myItem); 

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos())); 
myItemTransAnim -> setStartValue (QTransform::rotate (0, Qt::YAxis)); 
+0

解釋它是如何它不會編譯?沒有鏈接?根本不旋轉?或者轉向錯誤的方向?等等 – 2012-07-29 14:52:11

+0

Sry我忘了。它告訴我「不能調用成員函數'QTransform :: rotate'without object。但是我已經在myItemTransAnim中設置了一個對象(myItem)? – user1533754 2012-07-29 15:09:49

回答

1

的問題是QTransform::rotate是一個非靜態成員函數,意義這個語法只能用於引用一個函數(函數指針),而不是調用的函數。

方法QPropertyAnimation::setStartValue將一個值(不是函數)作爲它的參數,所以在你的情況下是一個QTransform值。 QTransform::rotate(...)(帶參數)是沒有價值的,事實上,它不能被編譯,因爲編譯器認爲你想用給定的參數調用靜態方法。

所以你可能會這樣:

myItemPosAnim -> setTargetObject (myItem); 
myItemTransAnim -> setTargetObject (myItem); 

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos())); 
QTransform transform; 
transform.rotate (0, Qt::YAxis): 
myItemTransAnim -> setStartValue (transform); 

但我仍然看到在你的代碼的一個大問題:你動畫的變換,而不是本身旋轉。旋轉變換是非線性的,這意味着如果您嘗試對從0°到180°的變換進行動畫製作,則不會得到您想要的內容。你寧願得到一個縮放動畫,因爲180°旋轉等於按照因子-1縮放座標系。這是因爲縮放的一個線性變換,並且QPropertyAnimation在開始和結束值之間進行插值,因此使用0.5 * start + 0.5 * end(即而非)計算旋轉矩陣所需的「開始和結束的中間值」。

由於QGraphicsItems的旋轉qreal類型的反正,只要使用此類型:

Q_PROPERTY (double rot READ rot WRITE setRotation) 

然後,您應該使用這個是這樣的:「不工作」

myItemPosAnim -> setTargetObject (myItem); 
myItemTransAnim -> setTargetObject (myItem); 

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos())); 
myItemTransAnim -> setStartValue (0.0); 
+0

hmm。你在」setRotationX「代碼中的含義是什麼?在想要告訴我「rotX和setRotationX沒有在這個範圍內聲明」的一些moc_files中出現編譯器錯誤 – user1533754 2012-07-29 16:14:10

+0

嗯,我剛剛意識到setRotation方法已經存在並且有類型qreal,而不是QTransform。在2D旋轉中指定一個軸也沒有任何意義,所以你應該沒問題,只需從Q_PROPERTY中刪除X.我改變了我的答案 – leemes 2012-07-29 16:22:54

+0

我已經刪除了最後一次運動中的X,但是我仍然得到這個錯誤,「rot is沒有在這個範圍內聲明「。那麼爲什麼?我也改變了我的Q_PROPERTY中的」rot「,並用myItemTransAnim - > setPropertyName(」r​​ot「)設置了我的代碼: – user1533754 2012-07-29 16:31:51