У меня есть 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, если мне нужно самостоятельно определить свойство геометрии?
Надеюсь, вы мне поможете, и извините, если мой вопрос расплывчатый, он для меня первый, поэтому я не знаю, чего вы ожидаете.
Большое спасибо, если вы нашли время, чтобы ответить.
Вы должны реализовать 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);
}
Полный пример можно найти Вот
Прежде всего QObject
не имеет geometry
имущество. Это свойство QWidget
, Сообщение об ошибке говорит вам, что нет geometry
а также setGeometry
функции-члены. Таким образом, вы должны предоставить эти методы. Увидеть пример в документации по системе собственности.