我有一个问题,我想为自己的类设置一个QGraphicsPixmapItem继承的qu属性宏。所以,我的第一个属性,我设置的位置非常好,但第二个,我想为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));
最佳答案
问题是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
计算的,这不是旋转矩阵所需要的。由于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);