QGraphicscene animation problem
-
i wana to work with animation , based on "animatedtiles" example .
i write a seprate class for creating QGraphicscene , like this :class First_win { public : First_win(){ Q_INIT_RESOURCE(animatedtiles); QPixmap kineticPix(":/images/kinetic.png"); scene.setSceneRect(-350, -350, 700, 700); QList<Pixmap *> items; for (int i = 0; i < 64; ++i) { Pixmap *item = new Pixmap(kineticPix); item->setOffset(-kineticPix.width()/2, -kineticPix.height()/2); item->setZValue(i); items << item; scene.addItem(item); } // Buttons QGraphicsItem *buttonParent = new QGraphicsRectItem; Button *ellipseButton = new Button(QPixmap(":/images/ellipse.png"), buttonParent); Button *figure8Button = new Button(QPixmap(":/images/figure8.png"), buttonParent); Button *randomButton = new Button(QPixmap(":/images/random.png"), buttonParent); Button *tiledButton = new Button(QPixmap(":/images/tile.png"), buttonParent); Button *centeredButton = new Button(QPixmap(":/images/centered.png"), buttonParent); ellipseButton->setPos(-100, -100); figure8Button->setPos(100, -100); randomButton->setPos(0, 0); tiledButton->setPos(-100, 100); centeredButton->setPos(100, 100); scene.addItem(buttonParent); buttonParent->setTransform(QTransform::fromScale(0.5, 0.5), true); buttonParent->setPos(0, 0); buttonParent->setZValue(65); // States QState *rootState = new QState; QState *ellipseState = new QState(rootState); QState *figure8State = new QState(rootState); QState *randomState = new QState(rootState); QState *tiledState = new QState(rootState); QState *centeredState = new QState(rootState); // Values for (int i = 0; i < items.count(); ++i) { Pixmap *item = items.at(i); // Ellipse ellipseState->assignProperty(item, "pos", QPointF(cos((i / 63.0) * 6.28) * 250, sin((i / 63.0) * 6.28) * 250)); // Figure 8 figure8State->assignProperty(item, "pos", QPointF(sin((i / 63.0) * 6.28) * 250, sin(((i * 2)/63.0) * 6.28) * 250)); // Random randomState->assignProperty(item, "pos", QPointF(-250 + qrand() % 500, -250 + qrand() % 500)); // Tiled tiledState->assignProperty(item, "pos", QPointF(((i % 8) - 4) * kineticPix.width() + kineticPix.width() / 2, ((i / 8) - 4) * kineticPix.height() + kineticPix.height() / 2)); // Centered centeredState->assignProperty(item, "pos", QPoint(0,0)); } QStateMachine states; states.addState(rootState); states.setInitialState(rootState); rootState->setInitialState(centeredState); QParallelAnimationGroup *group = new QParallelAnimationGroup; for (int i = 0; i < items.count(); ++i) { QPropertyAnimation *anim = new QPropertyAnimation(items[i], "pos"); anim->setDuration(750 + i * 25); //anim->setDuration(1000); anim->setEasingCurve(QEasingCurve::InOutBack); group->addAnimation(anim); } QAbstractTransition *trans = rootState->addTransition(ellipseButton, SIGNAL(pressed()), ellipseState); trans->addAnimation(group); trans = rootState->addTransition(figure8Button, SIGNAL(pressed()), figure8State); trans->addAnimation(group); trans = rootState->addTransition(randomButton, SIGNAL(pressed()), randomState); trans->addAnimation(group); trans = rootState->addTransition(tiledButton, SIGNAL(pressed()), tiledState); trans->addAnimation(group); trans = rootState->addTransition(centeredButton, SIGNAL(pressed()), centeredState); trans->addAnimation(group); QTimer timer; timer.start(125); timer.setSingleShot(true); trans = rootState->addTransition(&timer, SIGNAL(timeout()), ellipseState); trans->addAnimation(group); states.start(); } QGraphicsScene scene ; }; #endif // MAINWINDOW_H
and use this class on main :
QPixmap bgPix(":/images/Time-For-Lunch-2.jpg"); First_win fw ; View *view = new View(&(fw.scene)); view->setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Animated Tiles")); view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); view->setBackgroundBrush(bgPix); view->setCacheMode(QGraphicsView::CacheBackground); view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); view->show();
bye this codes , the aplication window are shown but animations not work
-
Hi,
Your state machine and timer are destroyed at the end of the constructor of First_win thus what's related to them won't execute.