问题
I have 2 classes, one MainWindow in which we draw in a QGraphicsView a circle (which intend to become a button !) created thanks to an other class. The class MyCircle inherits from QObject and QGraphicsItem since I want to make animation.
My issue is the following :
My goal is first to make a simple animation on my drawing : make it smaller then it goes back to the original size. So I suppose I should use the property geometry, already existing in the QObject class.
To do this I write in my 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();
If I don't include
class MyCircle : public QObject, public QGraphicsItem
{
Q_OBJECT
Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)
/.../
}
I got the following error message :
QPropertyAnimation: you're trying to animate a non-existing property geometry of your QObject
But if I do, i got this one :
'class MyCircle' has no member named 'geometry'/'setgeometry'
What is the purpose of inheriting QObject if I have to define all by myself the geometry property ?
Hope you can help me, and sorry if my question is vague, it's the first for me so I don't really know what you expect.
Thanks a lot if you take time to answer.
回答1:
You have to implement the geometry
and setGeometry
methods, the Q_PROPERTY
are used to call functions using the setProperty("geometry", some_value)
and property("geometry")
functions that are used internally in QPropertyAnimation
, as well as in the Setter function (in this case setGeometry
) you must call update()
to update the graph.
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);
}
A complete example can be found here
回答2:
First of all QObject
does not have a geometry
property. It is a property of QWidget
. The error message is telling you that there are no geometry
and setGeometry
member functions. So you have to provide those methods. See the example in property system docs.
来源:https://stackoverflow.com/questions/44327990/using-an-existing-q-property-to-animate-qgraphicsitem-inheriting-qobject