如何实时动画QGraphicsItem的轮廓?

时间:2015-05-19 05:09:08

标签: qt qgraphicsview qgraphicsitem

我正在用Qt设计一个计时器。使用QGraphicsEllipseItem,我画了一个圆圈,现在我需要每秒围绕这个圆圈(改变颜色)动画QPen。我找到了QGraphicsPathItem,但我需要一些关于如何前进的例子。有人能告诉我一个例子吗?

2 个答案:

答案 0 :(得分:1)

你有两个问题:

  1. QGraphicsEllipseItem不是QObject,因此QPropertyAnimation无法直接在此商品上使用
  2. QGraphicsItemAnimation并不涵盖您想制作动画的属性。
  3. 你能做什么?
    IMO的最佳方法是提供一些自定义QObject,您可以在其上执行此动画。您可以继承QObject或使用假QGraphicsObjectQObject)。

    class ShapeItemPenAnimator : public QGraphicsObject {
        Q_OBJECT
    private:
        QAbstractGraphicsShapeItem *mParent;
        QPropertyAnimation *mAnimation;
    
    public:
        QPROPERTY(QColor penColor
                  READ penColor
                  WRITE setPenColor)
    
        explicit ShapeItemPenAnimator(QAbstractGraphicsShapeItem * parent)
        : QGraphicsObject(parent)
        , mParent(parent) {
           setFlags(QGraphicsItem::ItemHasNoContents);
           mAnimation = new QPropertyAnimation(this, "penColor", this);
        }
    
        QColor penColor() const {
            return mParent->pen().color();
        }
    public slots:
        void setPenColor(const QColor &color) {
             QPen pen(mParent->pen());
             pen.setColor(color);
             mParent->setPen(pen);
        }
    
    public:
        void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0) {
        }
    
        QRectF boundingRect() const {
             return QRectF();
        }
    
        QPropertyAnimation *animation() const {
            return mAnimation;
        }
    }
    

    现在您只需将此对象附加到QGraphicsEllipseItem并设置所需的动画。

    // yourEllipse
    ShapeItemPenAnimator *animator = new ShapeItemPenAnimator(yourEllipse);
    animator->animation()->setEndValue(....);
    animator->animation()->setStartValue(....);
    animator->animation()->setDuration(....);
    animator->animation()->setEasingCurve(....);
    

答案 1 :(得分:0)

有几个类帮助Qt中的QGraphicsItem动画。我建议调查QGraphicsItemAnimationQPropertyAnimation。您可以使用第二个来设置项目颜色的动画。以下是使用QPropertyAnimation的示例: How to make Qt widgets fade in or fade out?