使用现有的q_property来动画qgraphictem继承qobject
Using an existing Q_PROPERTY to animate QGraphicsItem inheriting QObject
我有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的目的是什么?
希望您能为我提供帮助,对不起,如果我的问题含糊不清,那对我来说是第一个,所以我真的不知道您的期望。
如果您花时间回答非常感谢。
您必须实现geometry
和setGeometry
方法,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
的属性。错误消息告诉您没有geometry
和setGeometry
成员功能。因此,您必须提供这些方法。请参阅属性系统文档中的示例。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 使用 GLUT 使用键停止动画?
- 使用对象数组对 SFML 进行动画处理
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 从精灵表在 sfml 中为精灵制作动画
- Qt3D 骨骼动画
- ASCII 旋转光标 (TUI) 动画出现问题
- 带有 std::cout 的多线程控制台文本动画
- 有没有办法像动画一样移动控制台窗口?
- 围绕特定轴对 qt3d 旋转进行动画处理
- 如何在Qt中设置围绕固定点的线的动画
- 试图用c++制作一个动画加载圈
- 精灵动画查看器应该使用哪些Qt小部件
- 骨骼动画:变换矩阵(collada)之间的插值
- 使用增量时间的对象动画
- 精灵没有动画
- 使用 GDI+ 在C++中制作流畅的动画
- 使用现有的q_property来动画qgraphictem继承qobject