转自:http://blog.csdn.net/sprintfwater/article/details/8734991
SpringWater(GHQ)
//定义场景
QGraphicsScene scene(-350, -350, 700, 700);//定义图元
Pixmap *item = new Pixmap(kineticPix);
item->setOffset(-kineticPix.width()/2, -kineticPix.height()/2);
//将图元加载到场景中
scene.addItem(item);
//定义顶层控件,只要将父控件定义为此控件,则当父控件加入某场景,所有孩子都随之加入
QGraphicsItem *buttonParent = new QGraphicsRectItem;
//定义状态转移触发按键
Button *ellipseButton = new Button(QPixmap(":/images/ellipse.png"), buttonParent);
Button *figure8Button = new Button(QPixmap(":/images/figure8.png"), buttonParent);
//定义按键位置属性
ellipseButton->setPos(-100, -100);
figure8Button->setPos(100, -100);
//讲父控件加入该场景
scene.addItem(buttonParent);
定义该父控件在场景中的缩比例,位置,透明度的值
buttonParent->scale(0.75,0.75);
buttonParent->setPos(200, 200);
buttonParent->setZValue(65);
//定义父亲状态,只要将父状态定义为此状态,则当父状态加入某状态机,所有孩子状态都随之加入
QState *rootState = new QState;
//定义孩子状态
QState *ellipseState = new QState(rootState);
QState *figure8State = new QState(rootState);
//为孩子状态,赋予图元,并为该图元定义位置属性,即当状态为该状态时,该图元在在场景中的位置,就变为该状态定义的位置
ellipseState->assignProperty(item, "pos", QPointF(cos((i / 63.0) * 6.28) * 250, sin((i / 63.0) * 6.28) * 250));
figure8State->assignProperty(item, "pos", QPointF(sin((i / 63.0) * 6.28) * 250, sin(((i * 2)/63.0) * 6.28) * 250));
// Ui
//场景需要视图来展现在屏幕上
View *view = new View(&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);
#ifdef Q_OS_SYMBIAN
view->showMaximized();
#else
view->show();
#endif
//定义状态机,将rootState加入该状态机,随之他的孩子状态都加入了该状态机。
QStateMachine states;
states.addState(rootState);
//定义状态机的初始状态为根状态
states.setInitialState(rootState);
//从随根状态进入状态机的所有状态选一个状态作为初始状态
rootState->setInitialState( figure8State);
//为图元的状态过渡变化这个动作定义一个动画属性
QParallelAnimationGroup *group = new QParallelAnimationGroup;
//为该状态的位置属性定义一个动画
QPropertyAnimation *anim = new QPropertyAnimation(item, "pos");
//设置该动作变化的持续时间
anim->setDuration(750 + i * 25);
//设置改动作的变化速度曲线
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);
//为动画从初始设置的状态rootstate在125毫秒之后就跳转到ellipseState状态设置一个timer触发事件
QTimer timer;
timer.start(125);
//表示只触发一次,而不是循环没125触发一次
timer.setSingleShot(true);
trans = rootState->addTransition(&timer, SIGNAL(timeout()), ellipseState);
trans->addAnimation(group);
//启动状态机器
states.start();