Qt圖元,場景,檢視,狀態機,狀態轉移,動畫設定等的示列(備忘)
阿新 • • 發佈:2019-01-30
轉載註明出處 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();