• 9533阅读
  • 0回复

做QT动画的一个错误starting an animation without end value [复制链接]

上一主题 下一主题
离线goldbalance
 
只看楼主 倒序阅读 楼主  发表于: 2010-05-06
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"
快速回复
限100 字节
 
上一个 下一个