动画框架由基类QAbstractAnimation和它的两个儿子QVariantAnimation和QAnimationGroup组成。QAbstractAnimation是所有动画类的祖宗。它包含了所有动画的基本属性。比如开始,停止和暂停一个动画的能力。它也可以接收时间改变通知。
动画框架又进一步提供了QProertyAnimation类。它继承自QVariantAnimation并对某个Qt属性(它须是Qt的”元数据对象系统”的一部分。此类对属性执行一个宽松曲线插值。所以当你想去动画一个值时,你可以把它声明为一个属性,并且让你的类成为一个QObject。
这给予我们极大的自由度来动画那些已存在的widget和其它QObject。 复杂的动画可以通过建立一个QAbstractAnimation的树来构建。这个树通过使用QAnimationGroups来创建,QAnimationGroups作为其它动画的容器。注意动画组也是从QAbstractAnimation派生的,所以动画组可以再包含其它动画组。
动画框架可以单独使用,同时也被设计为状态机框架的一部分。状态机提供了一个特定的状态可以用来播放动画。在进入或退出某个状态时QState也可以设置属性们,并且这个特定的动画状态将在指定QPropertyAnimation时给予的值之间做插值运算。后面我们要进一步介绍此问题。
在场景的背后,动画被一个全局定时器收集,这个定时器发送update到所有的正在播放的动画中。
//设置本地编码 #include //编码
QTextCodec *codec = QTextCodec::codecForLocale();
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
resize(500, 300);
QPushButton *btn_start = new QPushButton(tr("开始"), this);
btn_start->setGeometry(10,10,50,25);
QPushButton *btn_stop = new QPushButton(tr("停止"), this);
btn_stop->setGeometry(65,10,50,25);
QLabel *label = new QLabel(tr("hello world!"), this);
label->setGeometry(200, 130, 80, 20);
label->setMinimumWidth(80);
/* 声明动画类,并将控制对象 this (this一定是继承自QObject的窗口部件) 以及属性名 "geometry" 传入构造函数 */
QPropertyAnimation* animation = new QPropertyAnimation(label, "geometry");
/* 设置动画持续时长为 2 秒钟 */
animation->setDuration(2000);
/* 设置动画的起始状态 起始点 (50,30) 起始大小 (30,20) */
animation->setStartValue(QRect(50, 30, 30, 20));
/* 设置动画的结束状态 结束点 (300,270) 结束大小 (30,20) */
animation->setEndValue(QRect(300, 270, 30, 20));
/* 设置动画效果 */
animation->setEasingCurve(QEasingCurve::CosineCurve);
/*一直运行,直到stop*/
animation->setLoopCount(-1);
//绑定信号与槽
connect(btn_start, SIGNAL(clicked(bool)), animation, SLOT(start()));
connect(btn_stop, SIGNAL(clicked(bool)), animation, SLOT(stop()));
this->resize(800,533);
//设置lab1的图片的样式
QLabel *lab1 = new QLabel(this);
lab1->setGeometry(0,0,800,533);
lab1->setStyleSheet("QLabel{border-image:url(fish_image/seaworld1.png);}");
//设置lab2的图片的样式
QLabel *lab2 = new QLabel(this);
lab2->setGeometry(0,0,800,533);
lab2->setStyleSheet("QLabel{border-image:url(fish_image/seaworld2.png);}");
//设置动画Animation1
QPropertyAnimation *Animation1 = new QPropertyAnimation(lab1,"geometry",this);
Animation1->setDuration(10000);//这个动画用时10秒
Animation1->setKeyValueAt(0,QRect(-800,0,800,533));
Animation1->setKeyValueAt(1,QRect(0,0,800,533));
//设置动画Animation2
QPropertyAnimation *Animation2 = new QPropertyAnimation(lab2,"geometry",this);
Animation2->setDuration(10000);//这个动画用时10秒
Animation2->setKeyValueAt(0,QRect(0,0,800,533));
Animation2->setKeyValueAt(1,QRect(800,0,800,533));
//把动画Animation1和动画Animation1加入动画组group
QParallelAnimationGroup *group = new QParallelAnimationGroup();
group->addAnimation(Animation1);
group->addAnimation(Animation2);
group->start();//动画组播放
group->setLoopCount(-1);//设置循环播放
动画的效果是把两张图片拼接起来,实现背景滚动的效果