[转载]QT DEMO animatedtiles

qt 状态机支持动画处理,挺不错的

Pixmap类继承 QObject 和QGraphicsPixmapItem两个类


继承QObject 的用途是用到Q_PROPERTY,表示这个类的一些属性值。这里用到了pos属性。

继承QGraphicsPixmapItem的用途就是直接用QPixmap类。


button 继承QGraphicsWidget 其原因我想就是
可以声明信号 signals 和进行相关按键的处理操作。

View 类主要是fitInView函数。

QGraphicsScene 是逻辑坐标
QGraphicsView 是物理坐标

QGraphicsItem 是逻辑坐标,可以看到五个button基于一个父类先根据逻辑坐标进行设置。然后添加到Scene中。

注意下面这句
QGraphicsItem *buttonParent = new QGraphicsRectItem;

button的父类不是普通的一个QGraphicsItem而是一个QGraphicsRectItem。这样我们看到的就是这五个按钮在一个矩形框中排布。


我觉得这个程序最核心的就是状态机的使用

这个例子逻辑思维是这样
首先建立一个根状态
QState *rootState = new QState;
然后以根状态为基础产生五个其他的状态

QState *State1 = new QState(rootState);
QState *State2= new QState(rootState);
QState *State3= new QState(rootState);
QState *State4= new QState(rootState);
QState *State5= new QState(rootState);

然后为每一个状态分配属性

State1 ->assignProperty(item, "pos", QPointF());

然后就是创建一个状态机,把根状态加入到状态机里

//状态机
QStateMachine StateMachine;
//添加根状态
StateMachine.addState(rootState);
//初始化根状态
StateMachine.setInitialState(rootState);
//根状态初始化
rootState->setInitialState(State1 );

每一个状态的转换如果没有动态效果,就不能体现QT的亮点,下面是Qt中核心思想动画类

首先我们知道一个View中多个元素的动态展现可以从时间上划分为并行和顺序。即这些元素可以并行展现,也可以顺序展现。


这个程序中用到的是并行展现64个图片元素。所以用到并行动画组
QParallelAnimationGroup

并行动画组把64个元素的每一个动画效果添加到组里为了保持同一个时间全部元素的展现。

QPropertyAnimation 是我们会经常用到的属性动画类,用来设置动画的属性值

这里只针对pos属性进行里相关的设置。


状态与状态之间如何进行切换,即从状态1到状态2如何进行关联呢?
这里是利用了根状态进行的

QAbstractTransition *trans = rootState->addTransition(Button1, SIGNAL(pressed()), State1);

//添加转换过程中的动画操作。
trans->addAnimation(group);

下面就是状态机开始工作
StateMachine.start();


我们还学到了定时器的用法

QTimer timer;
timer.start(125);
timer.setSingleShot(true);
//超时之后调用
trans = rootState->addTransition(&timer, SIGNAL(timeout()), ellipseState);
trans->addAnimation(group);

我想用QPropertyAnimation实现一个图片的平滑滚动,但是运行的时候提示 QPropertyAnimation::updateState (): Changing state of an animation without target
代码如下:
QPixmap image(("./images/test.jpg"));
Pixmap* pixItem = new Pixmap(image);
singleScene->addItem(pixItem);

QPropertyAnimation *animation = new QPropertyAnimation(pixItem,"pos");
animation->setDuration(1);
animation->setStartValue(QPoint(0, 360));
animation->setEndValue(QPoint(110, 180));
animation->start();

你可能感兴趣的:([转载]QT DEMO animatedtiles)