我遇到的问题是我想为自己的类设置一个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));
答案 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);