问题描述
我有2个类,其中一个MainWindow通过另一个类在QGraphicsView中绘制一个圆(打算成为按钮!).MyCircle类继承自QObject和QGraphicsItem,因为我想制作动画.
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.
我的问题如下:
我的目标是首先在我的图形上制作一个简单的动画:先缩小它,然后再恢复到原始大小.因此,我想我应该使用QObject类中已经存在的属性几何.
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.
为此,我在MainWindow.ccp中编写
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();
如果我不包括
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
但如果我这样做,我就会得到这个:
But if I do, i got this one :
'class MyCircle' has no member named 'geometry'/'setgeometry'
如果我必须自己定义所有的geometry属性,那么继承QObject的目的是什么?
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.
推荐答案
您必须实现geometry
和setGeometry
方法,Q_PROPERTY
用于使用setProperty("geometry", some_value)
和property("geometry")
函数调用函数在QPropertyAnimation
中以及Setter函数(在本例中为setGeometry
)中内部使用的图形,必须调用update()
来更新图形.
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);
}
可以在此处
这篇关于使用现有的Q_PROPERTY动画化继承QObject的QGraphicsItem的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!