QPropertyAnimation::updateState (geometry, Pixmap, p1): starting an animation without end value,请问这个问题怎么解决
#include <QtCore>
#include <QtGui>
class Pixmap : public QGraphicsWidget
{
Q_OBJECT
public:
QRectF* rect;
Pixmap(const QPixmap &pix, QGraphicsItem *parent = 0)
: QGraphicsWidget(parent), orig(pix), p(pix)
{
rect = new QRectF(0.0,0.0,64.0,64.0);
QObject::connect(this,SIGNAL(clickedme()),this,SLOT(shakeupdown()));
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
painter->drawPixmap(QPointF(), p);
}
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * mov)
{
emit clicked();
}
virtual void mousePressEvent(QGraphicsSceneMouseEvent * mov)
{
}
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent * mov)
{
}
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * mov)
{
emit clickedme();
}
virtual void setGeometry(QRectF *rect)
{
this->rect = rect;
QGraphicsWidget::setGeometry(*rect);
if (rect->size().width() > orig.size().width())
p = orig.scaled(rect->size().toSize());
else
p = orig;
}
Q_SIGNALS:
void clicked();
void clickedme();
public slots:
void shakeupdown();
private:
QPixmap orig;
QPixmap p;
};
void Pixmap::shakeupdown()
{
QPropertyAnimation *anim1=new QPropertyAnimation(this, "geometry");
anim1->setDuration(500);
anim1->setStartValue(QPoint(rect->topLeft().x(),rect->topLeft().y()-10));
//下面一句出现错误
anim1->setEndValue(QPoint(rect->topLeft().x(),rect->topLeft().y()));
anim1->setEasingCurve(QEasingCurve::OutBounce);
anim1->setLoopCount(3);
anim1->start();
}
QState *createGeometryState(QObject *w1, const QRect &rect1,
QObject *w2, const QRect &rect2,
QObject *w3, const QRect &rect3,
QObject *w4, const QRect &rect4,
QState *parent)
{
QState *result = new QState(parent);
result->assignProperty(w1, "geometry", rect1);
result->assignProperty(w2, "geometry", rect2);
result->assignProperty(w3, "geometry", rect3);
result->assignProperty(w4, "geometry", rect4);
return result;
}
void createStates(const QObjectList &objects,QState *parent,QState *idle)
{
for (int i = 0; i < objects.size(); ++i) {
QState *state = new QState(parent);
//QState *shake = new QState(state);
switch(i){
case 0:
state = createGeometryState(objects.at(0),QRect(6.0,106.0,84.0,84.0),objects.at(1),QRect(90.0,126.0,64.0,64.0),objects.at(2),QRect(154.0,126.0,64.0,64.0),objects.at(3),QRect(218.0,126.0,64.0,64.0),parent);
// shake->assignProperty(object.at(i),"geometry",);
break;
case 1:
state = createGeometryState(objects.at(0),QRect(6.0,126.0,64.0,64.0),objects.at(1),QRect(70.0,106.0,84.0,84.0),objects.at(2),QRect(154.0,126.0,64.0,64.0),objects.at(3),QRect(218.0,126.0,64.0,64.0),parent);
break;
case 2:
state = createGeometryState(objects.at(0),QRect(6.0,126.0,64.0,64.0),objects.at(1),QRect(70.0,126.0,64.0,64.0),objects.at(2),QRect(134.0,106.0,84.0,84.0),objects.at(3),QRect(218.0,126.0,64.0,64.0),parent);
break;
case 3:
state = createGeometryState(objects.at(0),QRect(6.0,126.0,64.0,64.0),objects.at(1),QRect(70.0,126.0,64.0,64.0),objects.at(2),QRect(134.0,126.0,64.0,64.0),objects.at(3),QRect(198.0,106.0,84.0,84.0),parent);
break;
}
parent->addTransition(objects.at(i), SIGNAL(clicked()), state);
// parent->addTransition(objects.at(i), SIGNAL(clickedme()), shake);
}
}
void createAnimations(const QObjectList &objects, QStateMachine *machine)
{
for (int i=0; i<objects.size(); ++i)
machine->addDefaultAnimation(new QPropertyAnimation(objects.at(i), "geometry"));
}
int main(int argc, char **argv)
{
Q_INIT_RESOURCE(appchooser);
QApplication app(argc, argv);
Pixmap *p1 = new Pixmap(QPixmap(":/digikam.png"));
Pixmap *p2 = new Pixmap(QPixmap(":/akregator.png"));
Pixmap *p3 = new Pixmap(QPixmap(":/accessories-dictionary.png"));
Pixmap *p4 = new Pixmap(QPixmap(":/k3b.png"));
p1->setObjectName("p1");
p2->setObjectName("p2");
p3->setObjectName("p3");
p4->setObjectName("p4");
QRectF *Rect1,*Rect2,*Rect3,*Rect4;
Rect1 = new QRectF(16.0, 126.0, 64.0, 64.0);
Rect2 = new QRectF(80.0, 126.0, 64.0, 64.0);
Rect3 = new QRectF(144.0, 126.0, 64.0, 64.0);
Rect4 = new QRectF(208.0, 126.0, 64.0, 64.0);
p1->setGeometry(Rect1);
p2->setGeometry(Rect2);
p3->setGeometry(Rect3);
p4->setGeometry(Rect4);
QGraphicsScene scene(0, 0, 300, 200);
scene.setBackgroundBrush(Qt::white);
scene.addItem(p1);
scene.addItem(p2);
scene.addItem(p3);
scene.addItem(p4);
QGraphicsView window(&scene);
window.setFrameStyle(0);
window.setAlignment(Qt::AlignLeft | Qt::AlignTop);
window.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
window.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
QStateMachine machine;
machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);
QState *group = new QState(&machine);
group->setObjectName("group");
QState *idleState = new QState(group);
group->setInitialState(idleState);
QObjectList objects;
objects << p1 << p2 << p3 << p4;
createStates(objects, group, idleState);
createAnimations(objects, &machine);
machine.setInitialState(group);
machine.start();
window.resize(300, 200);
window.show();
return app.exec();
}
#include "main.moc"