2012-05-14 96 views
0

我正在嘗試在GraphicsScene中做一些3D動畫,例如,在AnimationScene中使用Animation框架在GraphicsScene中旋轉圖片(使用類,從qPixmapItemQObject中分類)。qgraphicsItem不能動畫QTransform

一切工作正常,直到我想圍繞垂直軸旋轉圖片。 有沒有辦法通過item.rotate(),所以我使用QTranform

問題是,這樣做根本不會動畫。我究竟做錯了什麼?

P.S.我不想爲此使用OpenGl。

這是我做這件事的方式。這種方式適用於動畫簡單的屬性,如pos,旋轉(通過rotationsetRotation

我的代碼:

// hybrid graphicsSceneItem, supporting animation 
class ScenePixmap : public QObject, public QGraphicsPixmapItem 
{ 
    Q_OBJECT 
    Q_PROPERTY(QTransform transform READ transform WRITE setTransform) 
public: 
    ScenePixmap(const QPixmap &pixmap, QObject* parent = NULL, QGraphicsItem* parentItem = NULL): 
     QObject(parent), 
     QGraphicsPixmapItem(pixmap, parentItem) 

    {} 
}; 

這裏是我設置的場景和動畫如何:

//setup scene 
//Unrelated stuff, loading pictures, etc. 
      scene = new QGraphicsScene(this); 
     foreach(const QPixmap& image, images) 
     { 
      ScenePixmap* item = new ScenePixmap(image); 
      item->moveBy(70*i, 0); 
      i++; 
      this->images.append(item); 
      scene->addItem(item); 
     } 
    } 

    ui->graphicsView->setBackgroundBrush(QBrush(Qt::black, Qt::SolidPattern)); 
    ui->graphicsView->setScene(scene); 

    //setup animation 
QTransform getTransform() 
{ 
    QTransform transform; 
    transform.rotate(-30, Qt::ZAxis);//also tried transform = transform.rotate(...) 

    return transform; 
} 

QAbstractAnimation* SetupRotationAnimation(ScenePixmap* pixmapItem) 
{ 
    QPropertyAnimation* animation = new QPropertyAnimation(pixmapItem, "transform"); 
    animation->setDuration(1400); 
    animation->setStartValue(pixmapItem->transform()); 
    animation->setEndValue(getTransform());//here i tried to multiply with default transform , this does not work either 
    return animation; 
} 

這裏是我開始動畫的方式:

void MainWindow::keyPressEvent (QKeyEvent * event) 
{ 

    if((event->modifiers() & Qt::ControlModifier)) 
    { 
     QAnimationGroup* groupAnimation = new QParallelAnimationGroup(); 


     foreach(ScenePixmap* image, images) 
     { 
      groupAnimation->addAnimation(SetupRotationAnimation(image)); 

     } 

     groupAnimation->start(QAbstractAnimation::DeleteWhenStopped); 

    } 
} 

EDIT [解決] THX到達科Maksimovic:

下面是摸索出適合我的代碼:我看你用QTransform

QGraphicsRotation* getGraphicRotation() 
{ 
    QGraphicsRotation* transform = new QGraphicsRotation(this); 

    transform->setAxis(Qt::YAxis); 

    return transform; 
} 

QAbstractAnimation* SetupRotationAnimation(ScenePixmap* pixmapItem) 
{ 
    QGraphicsRotation* rotation = getGraphicRotation(); 

    QPropertyAnimation* animation = new QPropertyAnimation(rotation, "angle"); 
    animation->setDuration(1400); 
    animation->setStartValue(0); 
    animation->setEndValue(45); 

    pixmapItem->setTransformOriginPoint(pixmapItem->boundingRect().center()); 

    QList<QGraphicsTransform*> transfromations = pixmapItem->transformations(); 
    transfromations.append(rotation); 
    pixmapItem->setTransformations(transfromations); 

    return animation; 
} 
+0

你在哪裏調用'SetupRotationAnimation'? –

+0

添加了代碼。 – undefined

回答

2

。如果你只需要一次旋轉,那麼簡單的旋轉就是,你最好使用setRotation [別忘了setTransformOriginPoint]。

如果,但是,要記住很多旋轉,各地不同的變換點,例如,那麼你應該使用QGraphicsTransform,即其專業的派生類,QGraphicsRotation,該應用通過調用一個setTransformations圖形對象(您應該首先通過調用o.transformations()來獲取現有的轉換,附加到此,然後調用setTransformations;如果您保持指向添加的轉換的指針,您也可以直接稍後更改它)。

從您發佈的代碼中,我看不到您的錯誤來自哪裏,但通過使用專門的功能,您可以避免一些常見問題。

P.S.我也看到你在發佈的代碼中沒有使用prepareGeometryChange,所以請注意,在變換對象時這是必須的。

+0

它解決了,謝謝!我會更新問題點的解決方案 – undefined

+0

這不是「更好」的動畫旋轉,它根本就不會工作,否則 - 由設計。 –

0

問題很簡單。 QVariantAnimationQPropertyAnimation不支持QTransform。哎呀,他們現在甚至不支持無符號整數。這就是它的全部。每Qt文檔:

如果您需要插入其他變體類型(包括自定義類型),則必須爲這些自定義類型實現插值。爲此,您可以爲給定類型註冊插補器函數。該功能需要3個參數:起始值,結束值和當前進度。

生成這樣的內插器可能不是那麼簡單。請記住,你要「融入」兩個矩陣之間,同時保持矩陣的正交性和視覺效果。你需要的矩陣分解成單獨的旋轉沿軸,縮放,扭曲等子矩陣,然後分別插他們每個人。難怪Qt人沒有這樣做。這可能是很容易做的逆問題:生成所需的轉換矩陣的一些參數功能,通過組合必要的旋轉,平移等,所有給出的(也許是常數)功能。

僅僅因爲一個QVariant可攜帶式並不意味着它是由默認的內插器的支持。可能應該有一個運行時警告發出這種效果。