moveblocks工程存放在Qt安装目录下的
Examples\Qt-x.xx.xx\widgets\animation\moveblocks目录下。其中
x.xx.xx为Qt的版本号。
1.难点函数解释
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;
}
上面的函数创建了一个以parent为父的状态对象,并返还给调用方。当外层调用方进入到这个新创建的状态时,会同时改变参数w1、w2、w3、w4指向的对象的geometry属性分别为rect1、rect2、rect3、rect4。
state1 = createGeometryState(button1, QRect(100, 0, 50, 50),
button2, QRect(150, 0, 50, 50),
button3, QRect(200, 0, 50, 50),
button4, QRect(250, 0, 50, 50),
group);
...................................................
state7 = createGeometryState(button1, QRect(0, 0, 50, 50),
button2, QRect(250, 0, 50, 50),
button3, QRect(0, 250, 50, 50),
button4, QRect(250, 250, 50, 50),
group);
上面代码段创建了7个状态对象,且都是以group为父,根据Qt的状态机框架知识,我们得知那么这7个状态就组成了一组。
2.动画及动画组的创建及关系分析
QParallelAnimationGroup animationGroup;
.....................................
.....................................
.....................................
subGroup->addAnimation(anim);
以上代码创建了串行动画组、并行动画组。创建完后,各动画之间的关系如下:
其中外框矩形所在的动画或动作组为内框或框内动画、动画组的父。
3. StateSwitchEvent类分析
StateSwitchEvent派生自QEvent,类很简单,不在分析。
4. StateSwitchTransition分析
StateSwitchTransition派生自QAbstractTransition,其中eventTest的函数判断引起状态进入到本事务的事件类型是不是3步骤中的事件类型,如果是且事件的m_rand和本事务的m_rand相等,即如果这两个条件都为true,则外层调用方就会转到本事务。
5. StateSwitcher分析
StateSwitcher类派生自QState,对onEntry函数进行了重写,在该函数中不停的产生[0, m_stateCount) + 1)范围内的随机数,直到产生一个不等于m_lastIndex的随机数,然后状态机对象会投递一个StateSwitchEvent的事件,如果满足4中的条件,则就会执行4中的StateSwitchTransition事务。
6 流程图