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

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

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

Моя цель – сначала сделать простую анимацию на моем чертеже: уменьшите ее, затем вернитесь к исходному размеру. Поэтому я полагаю, что я должен использовать геометрию свойств, уже существующую в classе 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, если я должен сам определить свойство геометрии?

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

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

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

mycircle.h

 #ifndef MYCIRCLE_H #define MYCIRCLE_H #include  #include  #include  #include  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); } 

Полный пример можно найти здесь

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