2010-12-12 4 views
1

Я хотел бы создать вращающийся круг, нарисованный ручкой Qt:DotLine, с использованием Graphics View Framework. Используя QGraphicsItemAnimation, я могу вращать другие фигуры, но не круг. В приведенной ниже программе демонстрируется проблема: вместо прямоугольника и круга, вращающегося вместе, круг дергается, когда прямоугольник вращается грациозно.Анимированный QGraphicsItem с пунктирной ручкой

alt text

#include <QApplication> 
#include <QGraphicsView> 
#include <QGraphicsItem> 
#include <QTimeLine> 
#include <QGraphicsItemAnimation> 

QRectF rect (int r) 
{ 
    return QRectF (-r, -r, r * 2, r * 2); 
} 

void setupRot (QTimeLine *timeline, QGraphicsItem *item) 
{ 
    QGraphicsItemAnimation *animation = new QGraphicsItemAnimation; 
    animation->setItem(item); 
    animation->setTimeLine(timeline); 
    animation->setRotationAt (1, 360); 

    QObject::connect (timeline, SIGNAL(finished()), animation, SLOT(deleteLater())); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication app (argc, argv); 

    QGraphicsScene scene; 

    QTimeLine *timeline = new QTimeLine;  
    timeline->setDuration (3000); 
    timeline->setCurveShape (QTimeLine::LinearCurve); 
    QObject::connect (timeline, SIGNAL(finished()), timeline, SLOT(deleteLater())); 

    setupRot (timeline, scene.addEllipse (rect (50), QPen (QBrush (QColor ("blue")), 8, Qt::DotLine))); 
    setupRot (timeline, scene.addRect (rect (60))); 
    scene.addEllipse (rect (40), QPen (QBrush (QColor ("red")), 8));  

    scene.setSceneRect (-100, -100, 200, 200);  
    QGraphicsView view (&scene);  
    view.show();  
    timeline->setLoopCount (0); 
    timeline->start(); 
    return app.exec(); 
} 

пс: Я нашел некоторые образцы кода в Интернете, где люди, создавая промежуточные этапы анимации вручную, как это:

const int steps = 100; 
for (int i = 0; i < steps; ++i) 
    animation->setRotationAt (i/(float)steps, 360/(float)steps * i); 

Является ли это признаком людей не понимая понятия интерполяции, или есть какое-то преимущество установки (казалось бы, лишних) контрольных точек?

ответ

0

Какая версия/платформа? Если я запустил ваш код как есть (или замедлил 2x), вращение в пунктирном круге будет выглядеть так же хорошо, как прямоугольник в Windows с Qt 4.7.

+0

Это на Linux/X11 с QT 4.7.0. – Cactus

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