无法在 qgraphicsItem 中对 QTransform 进行动画处理
Can't animate QTransform in qgraphicsItem
我正在尝试在GraphicsScene中做一些3D动画,例如,使用动画框架在GraphicsScene中旋转图片(使用class,从qPixmapItem
和QObject
子类,如果它很重要的话(。
一切正常,直到我想绕垂直轴旋转图片。无法通过 item.rotate(( 执行此操作,所以我正在使用 QTranform
.
问题是这样做根本不会动画任何东西。我做错了什么?
附言我不想为此使用 OpenGl。
这是我的做法。这种方式适用于动画更简单的属性,如pos
、旋转(通过rotation
、setRotation
(
我的代码 :
// hybrid graphicsSceneItem, supporting animation
class ScenePixmap : public QObject, public QGraphicsPixmapItem
{
Q_OBJECT
Q_PROPERTY(QTransform transform READ transform WRITE setTransform)
public:
ScenePixmap(const QPixmap &pixmap, QObject* parent = NULL, QGraphicsItem* parentItem = NULL):
QObject(parent),
QGraphicsPixmapItem(pixmap, parentItem)
{}
};
以下是我设置场景和动画的方法:
//setup scene
//Unrelated stuff, loading pictures, etc.
scene = new QGraphicsScene(this);
foreach(const QPixmap& image, images)
{
ScenePixmap* item = new ScenePixmap(image);
item->moveBy(70*i, 0);
i++;
this->images.append(item);
scene->addItem(item);
}
}
ui->graphicsView->setBackgroundBrush(QBrush(Qt::black, Qt::SolidPattern));
ui->graphicsView->setScene(scene);
//setup animation
QTransform getTransform()
{
QTransform transform;
transform.rotate(-30, Qt::ZAxis);//also tried transform = transform.rotate(...)
return transform;
}
QAbstractAnimation* SetupRotationAnimation(ScenePixmap* pixmapItem)
{
QPropertyAnimation* animation = new QPropertyAnimation(pixmapItem, "transform");
animation->setDuration(1400);
animation->setStartValue( pixmapItem->transform());
animation->setEndValue(getTransform());//here i tried to multiply with default transform , this does not work either
return animation;
}
这是我开始动画的方式:
void MainWindow::keyPressEvent ( QKeyEvent * event )
{
if((event->modifiers() & Qt::ControlModifier))
{
QAnimationGroup* groupAnimation = new QParallelAnimationGroup();
foreach(ScenePixmap* image, images)
{
groupAnimation->addAnimation( SetupRotationAnimation(image));
}
groupAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}
}
编辑[解决]感谢达科·马克西莫维奇:
这是为我工作的代码:
QGraphicsRotation* getGraphicRotation()
{
QGraphicsRotation* transform = new QGraphicsRotation(this);
transform->setAxis(Qt::YAxis);
return transform;
}
QAbstractAnimation* SetupRotationAnimation(ScenePixmap* pixmapItem)
{
QGraphicsRotation* rotation = getGraphicRotation();
QPropertyAnimation* animation = new QPropertyAnimation(rotation, "angle");
animation->setDuration(1400);
animation->setStartValue( 0);
animation->setEndValue(45);
pixmapItem->setTransformOriginPoint(pixmapItem->boundingRect().center());
QList<QGraphicsTransform*> transfromations = pixmapItem->transformations();
transfromations.append(rotation);
pixmapItem->setTransformations(transfromations);
return animation;
}
我看到你使用QTransform。如果你只想要一个旋转,并且是简单的旋转,最好使用 setRotate[不要忘记 setTransformOriginPoint]。
但是,如果你想记住许多旋转,例如围绕不同的变换点,那么你应该使用 QGraphicsTransform,即它的专用派生类 QGraphicsRotation,你可以通过在图形对象上调用 setTransformations 来应用它(你应该首先通过调用 o.transformations(( 来获取现有的变换,附加到这个,然后调用 setTransformations;如果你保留指向添加的变换的指针,你以后也可以直接更改(。
从您发布的代码中,我看不到您的错误来自哪里,但是通过使用专门的功能,您可以避免一些常见问题。
附言我还看到您没有在发布的代码中使用 prepareGeometryChange,因此请注意,这在转换对象时是必要的。
问题很简单。 QVariantAnimation
和QPropertyAnimation
不支持QTransform
。哎呀,他们目前甚至不支持无符号整数。仅此而已。根据Qt文档:
如果需要插值其他变体类型(包括自定义类型(,则必须自行为这些变体类型实现插值。为此,您可以为给定类型注册插值器函数。此函数采用 3 个参数:起始值、结束值和当前进度。
生成这样的插值器可能不是那么简单。请记住,您必须在两个矩阵之间"混合",同时保持矩阵的正交性和视觉效果。您需要将矩阵分解为单独的沿轴旋转、缩放、倾斜等子矩阵,然后分别插值每个子矩阵。难怪Qt的人没有这样做。做逆问题可能要容易得多:通过组合必要的旋转、平移等,生成所需的转换矩阵作为某个参数 t 的函数,所有这些都作为 t 的(可能是常数(函数给出。
仅仅因为QVariant
可以携带类型并不意味着默认插值器支持它。可能应该为此发出运行时警告。
- 警告处理为错误这里有什么问题
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- 使用对象数组对 SFML 进行动画处理
- 围绕特定轴对 qt3d 旋转进行动画处理
- 是否可以在QT GUI应用程序中处理事件时播放加载动画指示器?
- 学习如何制作可以处理动画的程序的最佳方式
- QTableview单元格的值更新后,如何及时对它的颜色进行动画处理?
- 如何在 qt 中对 QPushButton 的背景颜色进行动画处理
- 无法在 qgraphicsItem 中对 QTransform 进行动画处理
- 对子类对象的数组进行动画处理
- QML如何对属性的每次更改进行动画处理?(只有最后一个更改动画可见)
- 如何在OpenGL中处理包含多个对象的动画