• 20458阅读
  • 17回复

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

上一主题 下一主题
离线hicjiajia
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-25
— 本帖被 XChinux 设置为精华(2011-01-28) —
Qt-4.6动画Animation快速入门三字决


Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序。不必像以前的版本一样,所有的控件都枯燥的呆在伟大光荣的QLayout里,也许它们可以唱个歌,跳个舞。
    所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情。当然做这件事情,最好用的就是状态机,没错Qt-4.6.0提供了QStateMachine类,不过今天我要讲的三字决要简单一些。

第一决:QPropertyAnimation

QPropertyAnimation用于和QObject中的属性properties进行通信,比如QWidget的大小,坐标等。来看代码
QPropertyAnimation *animation = new QPropertyAnimation(myWidget, “geometry”);
animation->setDuration(10000);
animation->setStartValue(QRect(0, 0, 100, 30));
animation->setEndValue(QRect(250, 250, 100, 30));
animation->start();

第一行创建的QPropertyAnimation对象关联了myWidget这个窗体的几何属性。后面的几句分别设置了这个动画的时长,起始坐标和结束坐标。剩下的事情就交改QProperAnimation去做就行了。然后调用start()启动它。没错,五行代码就完成了一个完成了一个自动从一个坐标点移动到另一个坐标点的窗体。下面我给出一个可以运行的代码,是一只小鸟从下角移到中间的一个小动画,当然你得自己准备这个同名的图片:)
  1. #include <QApplication>
  2. #include <QLabel>
  3. #include <QPixmap>
  4. #include <QPropertyAnimation>
  5. int main(int argc,char *argv[]){
  6.     QApplication app(argc,argv);
  7.     QWidget *w=new QWidget();
  8.     w->resize(300,400);
  9.     QPixmap birdimg=QPixmap(”twitter-bird.png”).scaled(40,40);
  10.     QLabel *bird_1=new QLabel(w);
  11.     bird_1->setPixmap(birdimg);
  12.     QPropertyAnimation *anim1=new QPropertyAnimation(bird_1, “pos”);
  13.     anim1->setDuration(2000);
  14.     anim1->setStartValue(QPoint(0, 360));
  15.     anim1->setEndValue(QPoint(110, 180));
  16.     anim1->start();
  17.     bird_1->move(-40,-40);
  18.     w->show();
  19.     return app.exec();
  20. }

上面的例子使用了label的位置属性pos。当然你可以在自己的类里增加其它property的,比如让颜色在变。

第二决:setEasingCurve

上面那个例子中小鸟的移动是线性的,未免太单调了点。QPropertyAnimation中的void setEasingCurve (const QEasingCurve & easing)函数正是用于实现不同的曲率变化的,QEasingCurve可用的参数列表(包括函数曲线图)可在文档中查到 。将上面动画相关的代码部分改成
QPropertyAnimation *anim1=new QPropertyAnimation(bird_1, “pos”);
anim1->setDuration(2000);
anim1->setStartValue(QPoint(0, 360));
anim1->setEndValue(QPoint(110, 180));
anim1->setEasingCurve(QEasingCurve::OutBounce);
anim1->start();

注意,新增的第四句。并且试试其它曲线参数,然后运行,看到的动态效果是不是不一样了。如果你对列表里已经有的曲线都不满意,你还可以继承QEasingCurve,实现你需要的效果。

第三决:QAnimationGroup

前面的例子是只有一个动画在运行,如果想多个动画一起运行的话,那就要用到动画组QAnimationGroup了。动画组分为两种分别为串行和并行,对应于QAnimationGroup的两个子类QSequentialAnimationGroup和QParallelAnimationGroup。其用法很简单
QSequentialAnimationGroup group;
//QParallelAnimationGroup group;
group.addAnimation(anim1);
group.addAnimation(anim2);
group.start();

上面的代码,如果是串行的话,那么动画anim1运行之后,才会运行anim2。如果是并行的话,两个动画是同时运行的。如果加了动画组,那么单个anim1->start()就没必要再单独调用了,由动画组来管理。 下面是一个可运行的代码,两只小鸟分别从窗体左上角和右下角移动到中间。
  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QLabel>
  4. #include <QPixmap>
  5. #include <QPropertyAnimation>
  6. #include <QSequentialAnimationGroup>
  7. #include <QParallelAnimationGroup>
  8. int main(int argc,char *argv[]){
  9.     QApplication app(argc,argv);
  10.     QWidget *w=new QWidget();
  11.     w->resize(300,400);
  12.     QPixmap birdimg=QPixmap(”twitter-bird.png”).scaled(40,40);
  13.     QLabel *bird_1=new QLabel(w);
  14.     bird_1->setPixmap(birdimg);
  15.     QPropertyAnimation *anim1=new QPropertyAnimation(bird_1, “pos”);
  16.     anim1->setDuration(2000);
  17.     anim1->setStartValue(QPoint(0, 360));
  18.     anim1->setEndValue(QPoint(110, 180));
  19.     //anim1->setEasingCurve(QEasingCurve::OutBounce);
  20.     anim1->start();
  21.     QLabel *bird_2=new QLabel(w);
  22.     bird_2->setPixmap(birdimg);
  23.     QPropertyAnimation *anim2=new QPropertyAnimation(bird_2, “pos”);
  24.     anim2->setDuration(2000);
  25.     anim2->setStartValue(QPoint(0, 0));
  26.     anim2->setEndValue(QPoint(150, 180));
  27.     anim2->setEasingCurve(QEasingCurve::OutBounce);
  28.     QSequentialAnimationGroup group;
  29.     //QParallelAnimationGroup group;
  30.     group.addAnimation(anim1);
  31.     group.addAnimation(anim2);
  32.     group.start();
  33.     bird_1->move(-40,-40);
  34.     bird_2->move(-40,-40);
  35.     w->show();
  36.     return app.exec();
  37. }

文章的源在:http://docs.google.com/View?id=dhhvrcmh_100m5xs7wf3,如有更新可能会反映在那边
[ 此帖被hicjiajia在2011-01-25 11:34重新编辑 ]
离线jwchen08
只看该作者 1楼 发表于: 2011-02-24
顶!绝对的好帖!
离线飞风在路

只看该作者 2楼 发表于: 2011-03-02
原来QT还有这么一个东西啊,刚好我要用到,很好,很及时
离线langzi

只看该作者 3楼 发表于: 2011-03-28
有没有在Qt4.4中编动画的例子啊?
离线luoyang

只看该作者 4楼 发表于: 2011-04-29
不错顶一下·~这是一个好东西~~
离线ppdayz

只看该作者 5楼 发表于: 2011-04-29
好东西,要顶
离线呆呆
只看该作者 6楼 发表于: 2011-04-29
很好啊,顶!!!
离线downstairs

只看该作者 7楼 发表于: 2011-05-02
UP.好东西啊。。
喜爱编程的猫头鹰
离线466036235
只看该作者 8楼 发表于: 2011-05-03
这个必须顶
离线dlmult
只看该作者 9楼 发表于: 2011-05-06
支持一下!
离线紫尘
只看该作者 10楼 发表于: 2011-05-10
好东西,顶!!!!
离线shaoshuai898

只看该作者 11楼 发表于: 2011-07-08
  
离线djx_zhou

只看该作者 12楼 发表于: 2012-01-05
不得不顶一个,厉害!
离线淳于半邪

只看该作者 13楼 发表于: 2012-01-18
学习了
离线joyquitelarg
只看该作者 14楼 发表于: 2012-02-23
好东西~~~~
离线xiaowu218
只看该作者 15楼 发表于: 2012-02-23
新手学习,谢谢了!
离线yanche

只看该作者 16楼 发表于: 2014-01-16
好东西,顶一下,多多研究和学习
具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
离线thegloves

只看该作者 17楼 发表于: 2016-12-14
好东西,学习了,谢谢楼主
快速回复
限100 字节
 
上一个 下一个