【问题标题】:Using an existing Q_PROPERTY to animate QGraphicsItem inheriting QObject使用现有的 Q_PROPERTY 为继承 QObject 的 QGraphicsItem 设置动画
【发布时间】:2017-11-03 19:25:57
【问题描述】:

我有 2 个类,一个 MainWindow,我们在 QGraphicsView 中绘制一个圆(打算成为一个按钮!),这要归功于另一个类。 MyCircle 类继承自 QObject 和 QGraphicsItem,因为我想做动画。

我的问题如下:

我的目标是首先在我的绘图上制作一个简单的动画:让它变小然后恢复到原始大小。所以我想我应该使用 QObject 类中已经存在的属性 geometry。

为此,我在 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的目的是什么?

希望你能帮助我,如果我的问题含糊不清,我很抱歉,这是我的第一个问题,所以我真的不知道你的期望。

非常感谢您花时间回答。

【问题讨论】:

    标签: c++ qt inheritance qt5 qproperty


    【解决方案1】:

    您必须实现 geometrysetGeometry 方法,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】:

      首先QObject 没有geometry 属性。它是QWidget 的属性。错误消息告诉您没有geometrysetGeometry 成员函数。所以你必须提供这些方法。见the example in property system docs

      【讨论】:

      • 我的错误!谢谢你的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多