所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情.当然做这件事情,最好用的就是状态机,点击这里查看Qt使用状态机实现动画效果实例。 不过,实现动画也有更简单的方法,Qt提供了QStateMachine类,应用该类可以快速的实现动画效果。 Qt动画三字诀:

第一决:QPropertyAnimation

QPropertyAnimation用于和QObject中的属性properties进行通信,比如QWidget的大小,位置坐标等。来看代码

1
2
3
4
5
6
7
8
9
10
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <QApplication>
#include <QPushButton>
#include <QPropertyAnimation>
#include <QPixmap>
#include <QLabel>
int main(int argc,char *argv[])
{
  QApplication app(argc,argv);
  QWidget *w=new QWidget();
  w->resize(640,520);
 
  QPixmap birdimg=QPixmap("bird.png").scaled(45,30);
  QLabel *bird=new QLabel(w);
  bird->setPixmap(birdimg);
  /*
      也可以使用setText函数设置标签显示的文字
      bird->setText("Hello");
   */
  QPropertyAnimation *anim=new QPropertyAnimation(bird,"pos");
  anim->setDuration(3000);
  anim->setStartValue(QPoint(0, 520));
  anim->setEndValue(QPoint(580, 10));
  anim->start();
 
  w->show();
  return app.exec();
}

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

第二决:setEasingCurve

上面那个例子中小鸟的移动是线性的,未免太单调了点。QPropertyAnimation中的void setEasingCurve (const QEasingCurve & easing)函数正是用于实现不同的曲率变化的,QEasingCurve可用的参数列表(包括函数曲线图)可在文档中查到 。将上面动画相关的代码部分改成:

1
2
3
4
5
6
7
8
9
10
11
QPropertyAnimation *anim=new QPropertyAnimation(bird,"pos");
 
anim->setDuration(2000);
 
anim->setStartValue(QPoint(0,360));
 
anim->setEndValue(QPoint(110,180));
 
anim1->setEasingCurve(QEasingCurve::OutBounce);
 
anim1->start();

注意,新增的第四句。是使动画效果变为弹跳效果,如果你对列表里已经有的曲线都不满意,你还可以继承QEasingCurve,实现你需要的效果。

第三决:QAnimationGroup

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

1
2
3
4
5
6
7
8
9
QSequentialAnimationGroup group;
 
//QParallelAnimationGroup group;
 
group.addAnimation(anim1);
 
group.addAnimation(anim2);
 
group.start();

上面的代码,如果是串行的话,那么动画anim1运行之后,才会运行anim2。如果是并行的话,两个动画是同时运行的。如果加了动画组,那么单个anim1->start()就没必要再单独调用了,由动画组来管理。 下面是一个可运行的代码,演示一只小鸟和一头猪依次从客户区飞过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<QApplication>
#include<QPixmap>
#include<QLabel>
#include<QPropertyAnimation>
#include<QSequentialAnimationGroup>
#include<QParallelAnimationGroup>
 
int main(int argc,char *argv[])
{
  QApplication app(argc,argv);
  QWidget *w=new QWidget();
  w->resize(900,600);
 
  QLabel *bird=new QLabel(w);
  bird->setPixmap(QPixmap("bird.png").scaled(40,40));
 
  QPropertyAnimation *bfly=new QPropertyAnimation(bird,"pos");
  bfly->setDuration(3000);
  bfly->setStartValue(QPoint(0, 560));
  bfly->setEndValue(QPoint(860, 0));
  bfly->setEasingCurve(QEasingCurve::CosineCurve);
 
  QLabel *pig=new QLabel(w);
  pig->setPixmap(QPixmap("pig.png").scaled(40,40));
 
  QPropertyAnimation *pfly=new QPropertyAnimation(pig,"pos");
  pfly->setDuration(3000);
  pfly->setStartValue(QPoint(0, 0));
  pfly->setEndValue(QPoint(860, 560));
  pfly->setEasingCurve(QEasingCurve::OutBounce);
 
  QSequentialAnimationGroup group;
  //QParallelAnimationGroup group;
  group.addAnimation(bfly);
  group.addAnimation(pfly);
  group.start();
 
  w->show();
  return app.exec();
}

可以切换动画组的类型,使动画以并行方式运行.点击这里下载该代码.

http://blog.csdn.net/itjobtxq/article/details/8951665

QT动画介绍(有例子可以下载)的更多相关文章

  1. Qt动画效果的实现,QPropertyAnimation

    Qt动画架构中的主要类如下图所示: 动画框架由基类QAbstractAnimation和它的两个儿子QVariantAnimation和QAnimationGroup组成.QAbstractAnima ...

  2. Qt动画与Qt坐标小记

    Qt动画 转载自: <http://jingyan.baidu.com/article/154b46315757b628ca8f4116.html> 和  <http://blog. ...

  3. Qt动画框架The Animation Framework

    动画框架是Kinetic(运动)项目的一部分,它的目标是提供一中简单的方法创建动画的和流畅的GUI.借助Qt动画属性,可以提供非常自由的动画窗体组件和其他对象(QObjects).动画框架也能被用于图 ...

  4. android动画介绍之 自己定义Animation动画实现qq抖一抖效果

    昨天我们介绍了Animation的基本使用方法.小伙伴们了解的怎么样了?假设还没有了解过Animation的小伙伴能够看看这篇博客 android动画介绍--Animation 实现loading动画 ...

  5. android动画介绍之 自定义Animation动画实现qq抖一抖效果

    昨天我们介绍了Animation的基本用法.小伙伴们了解的怎么样了?如果还没有了解过Animation的小伙伴可以看看这篇博客 android动画介绍--Animation 实现loading动画效果 ...

  6. android动画介绍--Animation 实现loading动画效果

    Animation的使用方法并不难.这里简单的介绍一下使用方法. 先看效果图: 效果还是不错的吧. 下面来看看使用方法. 动画效果是通过Animation来实现的,一共有四种,分别为: AlphaAn ...

  7. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句

    MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...

  8. [转]使用QT开发GoogleMap瓦片显示和下载工具

    第一节 之前做项目的时候经常遇到需要大量地图背景数据,然后没有数据被逼着去Google上下载瓦片数据在拼接成整张影像的工作,其实遥感影像晚上有很多可以下载到的,但是大部分是作为研究用的,作为GIS的背 ...

  9. 最新Burpsuite Pro v1.7.03 介绍和破解版下载

    0x00 介绍 Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息, ...

随机推荐

  1. ZOJ 3822 Domination

    题意: 一个棋盘假设每行每列都有棋子那么这个棋盘达到目标状态  如今随机放棋子  问达到目标状态的期望步数 思路: 用概率来做  计算第k步达到目标状态的概率  进而求期望  概率计算方法就是dp  ...

  2. linux中时间函数

    linux下常用时间类型有四种: time_t . struct   tm. struct  timeval .    struct   timespec 1.time_t   时间函数 time_t ...

  3. /etc/ld.so.conf详解

    /etc/ld.so.conf 此文件记录了编译时使用的动态库的路径,也就是加载so库的路径.    默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,而通常通过源码包进行安装 ...

  4. connot find one or more components. please reinstall the application

    正在用 Visual Studio 2013 写程序,程序一直执行正常. 此时,手动把注册表"HKEY_USERS"的当前用户的权限删除.再运行程序会提示:“是否继续并运行上次的成 ...

  5. POJ 2115 模线性方程 ax=b(mod n)

    /* (x*c+a)%(2^k)==b →(x*c)%(2^k)==b-a 满足定理: 推论1:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n) | b. 推论2:方程ax=b(m ...

  6. objective-C学习笔记(十)协议

    协议 Protocol 协议是类的合同约定,只描述外部接口,不提供具体实现.所以,协议其实可以写在类的.h文件中,不去实现就可以了. 协议可以包含以下成员: 属性 (编译器不会和普通interface ...

  7. Java调用R——rJava的安装和配置

    rJava是Java通过JRI调用R所要安装的包.配置起来比较麻烦,我参考网上进行配置,使用rJava包中example里面的示例测试,控制台显示: Cannot find JRI native li ...

  8. BZOJ 2982: combination( lucas )

    lucas裸题. C(m,n) = C(m/p,n/p)*C(m%p,n%p). ----------------------------------------------------------- ...

  9. Java web 开发环境配置。

    一.配置 win8 64位 环境java 开发环境 1.  下载JDK,地址 http://www.oracle.com/technetwork/java/javase/downloads/index ...

  10. 禁用Java DNS缓存-Disable DNS caching

    Once an application has performed network access (i.e. urlconnection, parsing of xml document with e ...