0

我有 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 的目的是什么?

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

非常感谢您花时间回答。

4

2 回答 2

1

您必须实现geometrysetGeometry方法,用于使用和内部Q_PROPERTY使用的函数调用函数,以及必须调用的 Setter 函数(在这种情况下)以更新图形。setProperty("geometry", some_value)property("geometry")QPropertyAnimationsetGeometryupdate()

我的圈子.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

我的圈子.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);
}

一个完整的例子可以在这里找到

于 2017-06-02T12:11:50.467 回答
1

首先QObject没有geometry财产。它是 的属性QWidget。错误消息告诉您没有geometrysetGeometry成员函数。所以你必须提供这些方法。请参阅属性系统文档中的示例

于 2017-06-02T12:08:07.240 回答