使用现有的q_property来动画qgraphictem继承qobject

Using an existing Q_PROPERTY to animate QGraphicsItem inheriting QObject

本文关键字:动画 qgraphictem 继承 qobject property      更新时间:2023-10-16

我有2个类,一个mainwindow,我们在其中绘制了一个圆圈(打算成为一个按钮!(,这要归功于另一个类。我想制作动画,从qobject和qgraphictem继承了类mycircle。

我的问题是:

我的目标是首先在我的图纸上制作一个简单的动画:使其更小,然后再恢复到原始尺寸。因此,我想我应该使用已存在于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的目的是什么?

希望您能为我提供帮助,对不起,如果我的问题含糊不清,那对我来说是第一个,所以我真的不知道您的期望。

如果您花时间回答非常感谢。

您必须实现geometrysetGeometry方法,Q_PROPERTY用于使用QPropertyAnimation内部使用的setProperty("geometry", some_value)property("geometry")函数来调用函数此情况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的属性。错误消息告诉您没有geometrysetGeometry成员功能。因此,您必须提供这些方法。请参阅属性系统文档中的示例。