QTransform :: setRotation与Q_PROPERTY

时间:2012-07-29 13:47:15

标签: c++ linux qt

我遇到的问题是我想为自己的类设置一个Q_PROPERTY宏,由QGraphicsPixmapItem继承。所以我的第一个属性,我设置的位置非常好,但第二个我想为Qt :: YAxis设置旋转不起作用,我不知道如何正确编写它。我需要这个属性来制作动画。以下是我的尝试:

- A.H -

class myOwnPixmapItem : public QObject, public QGraphicsPixmapItem
{
    Q_OBJECT
    Q_PROPERTY (QPointF pos READ pos WRITE setPos)
    Q_PROPERTY (QTransform rot READ rot WRITE setRotation)

public:
    flowNpixmapItem()
};

- A.cpp -

myItemPosAnim -> setTargetObject (myItem);
myItemTransAnim -> setTargetObject (myItem);

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos()));
myItemTransAnim -> setStartValue (QTransform::rotate (0, Qt::YAxis));

1 个答案:

答案 0 :(得分:1)

问题是QTransform::rotate是非静态成员函数,这意味着此语法只能用于引用函数(函数指针),而不能用于调用功能。

方法QPropertyAnimation::setStartValue将一个值(不是函数)作为其参数,因此在您的情况下是一个QTransform值。 QTransform::rotate(...)(带参数)没有值,实际上,它无法编译,因为编译器认为你想用给定的参数调用静态方法。

所以你可能想要这个:

myItemPosAnim -> setTargetObject (myItem);
myItemTransAnim -> setTargetObject (myItem);

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos()));
QTransform transform;
transform.rotate (0, Qt::YAxis):
myItemTransAnim -> setStartValue (transform);

但我仍然在你的代码中看到一个大问题:你为变换设置动画,而不是旋转本身。旋转变换是非线性的,这意味着如果您尝试将变换从0°设置为180°,则无法获得所需的变换。你宁愿得到一个缩放动画,因为180°旋转等于坐标系缩放因子-1。这是因为缩放线性变换,QPropertyAnimation在开始和结束值之间进行插值,所以“开始和结束之间的中间”是使用0.5 * start + 0.5 * end来计算的,这是 not 你想要的旋转矩阵。

由于QGraphicsItems的旋转无论如何都是qreal类型,只需使用此类型:

Q_PROPERTY (double rot READ rot WRITE setRotation)

然后你应该这样使用:

myItemPosAnim -> setTargetObject (myItem);
myItemTransAnim -> setTargetObject (myItem);

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos()));
myItemTransAnim -> setStartValue (0.0);