• 8790阅读
  • 0回复

Qt 动画快速入门(二) [复制链接]

上一主题 下一主题
离线hicjiajia
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-25
— 本帖被 XChinux 设置为精华(2011-01-28) —
Qt-4.6 Animation动画实现之状态机


前文Qt-4.6动画Animation快速入门三字决介绍了在Qt-4.6中实现动画的核心要素。这里再介绍Qt-4.6中提供的状态机框架,它为实现复杂的动画效果提供了一个方便的接口。
在接触代码前,先来看一个简单的状态机图(利用Linux工具Dia完成)

状态机顾名思义,应该有不同的状态在切换。上面状态机图中,我们提供了两种状态state1和state2。而状态的区分是由状态的属性来描述的,比如p1,p2…等等。从一个状态到另一个状态的转化,必须由触发条件来完成,上图state1到state2的状态转换由transition1来表示,state2到state1的状态转换由transition2来表示。如果希望在状态转换过程中有动画来展示,那么可以在transition1和transition2中加入动画效果animation1和animation2 。最后,状态机进入需要有一个初始状态,我们可以设定state1为我们这个状态机的初始态。
有了状态机的描述图,我们就可以看看用Qt-4.6的代码,如何实现以上功能。
创建状态机
QStateMachine *machine = new QStateMachine;

创建两个状态,状态的属性由一个QPushButton的位置大小决定。
QPushButton *button = new QPushButton(”Animated Button”);
QState *state1 = new QState(machine);
state1->assignProperty(button, “geometry”, QRect(0, 0, 150, 30));
QState *state2 = new QState(machine);
state2->assignProperty(button, “geometry”, QRect(250, 250, 150, 30));

将状态1设置为状态机的初始状态
machine->setInitialState(state1);

增加触发状态1到状态2的触发条件,QPushButton按钮被按下,动画效果由addAnimation()完成
QSignalTransition *transition1 = state1->addTransition(button,SIGNAL(clicked()), state2);
transition1->addAnimation(new QPropertyAnimation(button, “geometry”));

细心的读者可能发现QPropertyAnimation的setStartValue()和setEndValue()都没有被调用到。其实这里动画变化的初始态和结束态,由state1和state2决定的。另外,如果没有设置动画的持续时长,则默认是250毫秒。
同理,增加状态2到状态1的触发条件,也是按钮被按下
QSignalTransition *transition2 = state2->addTransition(button,SIGNAL(clicked()), state1);
transition2->addAnimation(new QPropertyAnimation(button, “geometry”));

最后一步,将状态机启动即可,是不是很简单?
machine->start();

完整代码在下头

  1. #include <QApplication>
  2. #include <QPushButton>
  3. #include <QStateMachine>
  4. #include <QState>
  5. #include <QSignalTransition>
  6. #include <QPropertyAnimation>
  7. int main(int argc,char *argv[]){
  8.     QApplication app(argc,argv);
  9.     QPushButton *button = new QPushButton(”Animated Button”);
  10.     button->show();
  11.     QStateMachine *machine = new QStateMachine;
  12.     //QState *state1 = new QState(machine->rootState());
  13.     QState *state1 = new QState(machine);
  14.     state1->assignProperty(button, “geometry”, QRect(0, 0, 150, 30));
  15.     machine->setInitialState(state1);
  16.     //QState *state2 = new QState(machine->rootState());
  17.     QState *state2 = new QState(machine);
  18.     state2->assignProperty(button, “geometry”, QRect(250, 250, 150, 30));
  19.     QSignalTransition *transition1 = state1->addTransition(button,SIGNAL(clicked()), state2);
  20.     transition1->addAnimation(new QPropertyAnimation(button, “geometry”));
  21.     QSignalTransition *transition2 = state2->addTransition(button,SIGNAL(clicked()), state1);
  22.     transition2->addAnimation(new QPropertyAnimation(button, “geometry”));
  23.     machine->start();
  24.     return app.exec();
  25. }

//这个代码来自于Qt-4.6 Assistant帮助的Animation索引,原代码的rootState()函数是没有的,应该算是bug了吧:)
快速回复
限100 字节
 
上一个 下一个