我被困在一个简单的属性动画在一个场景中的属性。这个项目只需移动一段距离。有了房产"pos“它就会移动。使用我的属性"ScenePosition“,它不能工作。调试器进入函数setScenePosition(),但对显示的场景没有影响。
// chip.h
class Chip : public QObject, public QGraphicsEllipseItem
{
Q_OBJECT
//THIS WORKS - But i have to use scenePosition instead because of the scene
Q_PROPERTY(QPointF pos READ pos WRITE setPos)
// MY ATTEMPT
Q_PROPERTY(QPointF ScenePosition READ ScenePosition WRITE setScenePosition)
public:
explicit Chip(int x, int y, int w, int h, QObject *parent=NULL);
void setScenePosition(QPointF p);
QPointF ScenePosition();
};我想我使用scenePos()的方式是错误的。
//chip.cpp
void Chip::setScenePosition(QPointF p)
{
this->scenePos().setX(p.x());
this->scenePos().setY(p.y());
}最后是动画的呼唤。这个调用似乎没问题,因为它适用于新的QPropertyAnimation(item,"pos"),但不适用于"ScenePosition“wich,这让我对setter的实现产生了怀疑。
item = new Chip(col*wCol, 100, wCol, wCol);
item->setVisible(true);
QPropertyAnimation *animation = new QPropertyAnimation(item, "ScenePosition");
addItem(item);
animation->setDuration(1000);
animation->setEndValue( QPoint(col*wCol, 400 - wCol*stacked) );
animation->setEasingCurve(QEasingCurve::OutElastic);
animation->start();发布于 2014-01-10 18:31:49
this->scenePos()返回QPointF。使用this->scenePos().setX(p.x());只会影响临时QPointF对象,显然不会影响项目位置。您需要使用类似于this->setScenePos(p);的东西。然而,并没有这样的方法。如果该项目没有父项,则this->setPos(p)将等效地工作。如果项目有父项,则可以使用this->setPos(this->parentItem()->mapfromScene(p));。mapFromScene将p从场景坐标转换为父项坐标系,子项使用父项坐标系统定位,因此应该正确工作。
https://stackoverflow.com/questions/21047040
复制相似问题