Создание анимации с простейшими геометрическими фигурами

Рейтинг: 1Ответов: 1Опубликовано: 04.07.2023

Хочу создать геометрическую фигуру (к примеру, квадрат), чтобы она мигала. Понимаю, что надо использовать класс QPropertyAnimation.

В конструкторе этого класса такое определение QPropertyAnimation ( QObject * target, const QByteArray & propertyName, QObject * parent = 0 ).

Мною был создан класс с отрисовкой геометрической фигуры, который наследуется от QGraphicsItem.

class Rect: public QGraphicsItem {
private:
    int width = 500;
    int height = 500;
public:
    Rect();
    ~Rect();
protected:
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);    
};

Но при создании объекта класса QPropertyanimation он не принимает в качестве аргумента мой объект. Почему?

Ответы

▲ 2Принят

У QPropertyAnimation в качестве объекта анимации принимается указатель на QObject, следовательно, от этого класса вам надо наследовать ваш Rect (лучше выбрать другое имя). Это первое. Второе, мигание подразумевает изменение цвета, а для того, чтобы QPropertyAnimation "добрался" до соответствующего свойства объекта, его (свойство) необходимо определить через макрос Q_PROPERTY:

class Rect: public QObject, public QGraphicsItem {
    Q_OBJECT
    Q_PROPERTY(QColor flashingColor READ flashingColor WRITE setFlashingColor)

public:
    void setFlashingColor(const QColor& color) {
        flashingColor = color;
        update();
    }

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
       // рисуем фигуру цветом flashingColor
    }

Анимация задается вот так (если указатель на объект QPropertyAnimation создается в конструкторе класса Rect):

QPropertyAnimation *animation = new QPropertyAnimation(this , "flashingColor");
animation->setDuration(1000);
animation->setStartValue(QColor(0, 0, 0));
animation->setEndValue(QColor(255, 255, 255));
animation->start();