使用现有的 Q_PROPERTY 为继承 QObject 的 QGraphicsItem 设置动画
Using an existing Q_PROPERTY to animate QGraphicsItem inheriting QObject
我有 2 个 classes,一个 MainWindow,我们在 QGraphicsView 中绘制了一个圆圈(打算成为一个按钮!),这要归功于另一个 class。
class MyCircle继承自QObject和QGraphicsItem,因为我要制作动画。
我的问题如下:
我的目标是首先在我的绘图上制作一个简单的动画:缩小它然后恢复到原始大小。所以我想我应该使用 QObject class.
中已经存在的 属性 几何图形
为此,我在 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 的目的是什么 属性?
希望你能帮助我,如果我的问题含糊不清,我很抱歉,这对我来说是第一次,所以我真的不知道你的期望。
非常感谢您花时间回答。
首先QObject
没有一个geometry
属性。它是 QWidget
的 属性。错误消息告诉您没有 geometry
和 setGeometry
成员函数。所以你必须提供那些方法。参见 the example in property system docs。
您必须实现 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);
}
可以找到完整的例子here
我有 2 个 classes,一个 MainWindow,我们在 QGraphicsView 中绘制了一个圆圈(打算成为一个按钮!),这要归功于另一个 class。 class MyCircle继承自QObject和QGraphicsItem,因为我要制作动画。
我的问题如下:
我的目标是首先在我的绘图上制作一个简单的动画:缩小它然后恢复到原始大小。所以我想我应该使用 QObject class.
中已经存在的 属性 几何图形为此,我在 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 的目的是什么 属性?
希望你能帮助我,如果我的问题含糊不清,我很抱歉,这对我来说是第一次,所以我真的不知道你的期望。
非常感谢您花时间回答。
首先QObject
没有一个geometry
属性。它是 QWidget
的 属性。错误消息告诉您没有 geometry
和 setGeometry
成员函数。所以你必须提供那些方法。参见 the example in property system docs。
您必须实现 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);
}
可以找到完整的例子here