Использование существующего Q_PROPERTY для анимации QGraphicsItem, наследующего QObject

У меня есть 2 класса, одно MainWindow, в котором мы рисуем в QGraphicsView круг (который намеревается стать кнопкой!), Созданный благодаря другому классу.
Класс MyCircle наследуется от QObject и QGraphicsItem, так как я хочу сделать анимацию.

Моя проблема заключается в следующем:

Моя цель — сначала сделать простую анимацию на моем чертеже: сделать его меньше, а потом вернуться к исходному размеру. Поэтому я полагаю, что я должен использовать свойство геометрии, уже существующее в классе QObject.

Для этого я пишу в своем MainWindow.ccp

animationBoutonRondTaille = new QPropertyAnimation(roundButton, "geometry");
animationBoutonRondTaille->setDuration(1000);
animationBoutonRondTaille->setKeyValueAt(0, QRect(-100, -100, 200, 200));
animationBoutonRondTaille->setKeyValueAt(0.5, QRect(-80,-80,160,160));
animationBoutonRondTaille->setKeyValueAt(1, QRect(-100, -100, 200, 200));
animationBoutonRondTaille -> start();

Если я не включу

class MyCircle : public QObject, public QGraphicsItem
{
Q_OBJECT
Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)
/.../
}

Я получил следующее сообщение об ошибке:

QPropertyAnimation: you're trying to animate a non-existing property geometry of your QObject

Но если я это сделаю, я получу это:

'class MyCircle' has no member named 'geometry'/'setgeometry'

Какова цель наследования QObject, если мне нужно самостоятельно определить свойство геометрии?

Надеюсь, вы мне поможете, и извините, если мой вопрос расплывчатый, он для меня первый, поэтому я не знаю, чего вы ожидаете.

Большое спасибо, если вы нашли время, чтобы ответить.

0

Решение

Вы должны реализовать geometry а также setGeometry методы, Q_PROPERTY используются для вызова функций с использованием setProperty("geometry", some_value) а также property("geometry") функции, которые используются внутри QPropertyAnimation, а также в функции Setter (в данном случае setGeometry) ты должен позвонить update() обновить график.

mycircle.h

#ifndef MYCIRCLE_H
#define MYCIRCLE_H

#include <QGraphicsItem>
#include <QObject>
#include <QPainter>
#include <QStyleOptionGraphicsItem>

class MyCircle : public QObject, public QGraphicsItem
{
Q_OBJECT
Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)
Q_INTERFACES(QGraphicsItem)
public:
explicit MyCircle(QObject *parent = nullptr);

QRect geometry() const;
void setGeometry(const QRect &value);

QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);

private:

QRect rect;
};

#endif // MYCIRCLE_H

mycircle.cpp

#include "mycircle.h"
MyCircle::MyCircle(QObject *parent) : QObject(parent)
{
rect = QRect(0, 0, 100, 100);
}

QRect MyCircle::geometry() const
{
return rect;
}

void MyCircle::setGeometry(const QRect &value)
{
if(rect!=value){
rect = value;
update();
}
}

QRectF MyCircle::boundingRect() const
{
return QRectF(rect);
}void MyCircle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
Q_UNUSED(option)
Q_UNUSED(widget)
painter->setBrush(QBrush(Qt::red));
painter->drawEllipse(rect);
}

Полный пример можно найти Вот

1

Другие решения

Прежде всего QObject не имеет geometry имущество. Это свойство QWidget, Сообщение об ошибке говорит вам, что нет geometry а также setGeometry функции-члены. Таким образом, вы должны предоставить эти методы. Увидеть пример в документации по системе собственности.

1

По вопросам рекламы [email protected]