gpt4 book ai didi

c++ - 使用现有的 Q_PROPERTY 为继承 QObject 的 QGraphicsItem 制作动画

转载 作者:行者123 更新时间:2023-11-28 01:47:31 25 4
gpt4 key购买 nike

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

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

非常感谢您花时间回答。

最佳答案

您必须实现 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

关于c++ - 使用现有的 Q_PROPERTY 为继承 QObject 的 QGraphicsItem 制作动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44327990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com