0

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

- 啊 -

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));
4

1 回答 1

1

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

该方法QPropertyAnimation::setStartValue将值(不是函数)作为其参数,因此在您的情况下是 QTransform 值。QTransform::rotate(...)(with arguments) 没有价值,事实上,它不能被编译,因为编译器认为你想用给定的参数调用静态方法。

所以你可能想要这个:

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,这不是旋转矩阵想要的。

由于 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);
于 2012-07-29T15:30:46.820 回答