Qt动画架构中的主要类

  • Qt动画架构中的主要类如下图所示:

动画框架由基类QAbstractAnimation和它的两个儿子QVariantAnimation和QAnimationGroup组成。QAbstractAnimation是所有动画类的祖宗。它包含了所有动画的基本属性。比如开始,停止和暂停一个动画的能力。它也可以接收时间改变通知。

动画框架又进一步提供了QProertyAnimation类。它继承自QVariantAnimation并对某个Qt属性(它须是Qt的”元数据对象系统”的一部分,见http://blog.csdn.net/nkmnkm/article/details/8225089)执行动画。此类对属性执行一个宽松曲线插值。所以当你想去动画一个值时,你可以把它声明为一个属性,并且让你的类成为一个QObject。这给予我们极大的自由度来动画那些已存在的widget和其它QObject。

复杂的动画可以通过建立一个QAbstractAnimation的树来构建。这个树通过使用QAnimationGroups来创建,QAnimationGroups作为其它动画的容器。注意动画组也是从QAbstractAnimation派生的,所以动画组可以再包含其它动画组。

动画框架可以单独使用,同时也被设计为状态机框架的一部分。状态机提供了一个特定的状态可以用来播放动画。在进入或退出某个状态时QState也可以设置属性们,并且这个特定的动画状态将在指定QPropertyAnimation时给予的值之间做插值运算。后面我们要进一步介绍此问题。

在场景的背后,动画被一个全局定时器收集,这个定时器发送update到所有的正在播放的动画中。

  • 动画框架中的类们

QAbstractAnimation 所有动画类的基类

QAnimationGroup 动画组的基类

QEasingCurve 控制动画的宽松曲线类

QParallelAnimationGroup 并行动画组类

QPauseAnimation 串行动画组类的暂停类

QPropertyAnimation 动画Qt属性的类

QSequentialAnimationGroup 串行动画组类

QTimeLine 控制动画的时间线类

QVariantAnimation 各动画类的虚基类

  • 动画Qt属性们

如前面所讲,QPropertyAnimation类可以修改Qt属性们。要动画一个值,就需要使用此类。实际上,它的父类,QVariantAnimation,是一个虚拟类,不能被直接使用。

1、我们选择动画Qt属性的一个主要理由是Qt属性为我们提供了自己动画已存在的类的自由度。尤其是QWidget类(我们也可以把它嵌入到一个QGraphicsView中)具有很多属性表示其bounds,colors等等。让我们看一个小例子:

QPushButton button("Animated Button");

button.show();

QPropertyAnimation animation(&button, "geometry");

animation.setDuration(10000);

animation.setStartValue(QRect(0, 0, 0, 0));

animation.setEndValue(QRect(250, 250, 100, 30));

animation.start();

这段代码将把按钮在10秒种内从屏幕的左上角移动到(250,250)处,而且是逐渐变大。见下图效果:

2、上面的例子举在开始值和结束值之间做线性插值。还可以在开始和结束值之间设置值,插值运算就会经过这些点。

animation1 = new QPropertyAnimation(ui.pushButton, "geometry");

animation1->setDuration(10000);

animation1->setKeyValueAt(0, QRect(0, 0, 00, 00));

animation1->setKeyValueAt(0.4, QRect(20, 250, 20, 30));

animation1->setKeyValueAt(0.8, QRect(100, 250, 20, 30));

animation1->setKeyValueAt(1, QRect(250, 250, 100, 30));

animation1->setEndValue(QRect(250, 250, 100, 30));

在此例中,动画将按钮在8秒中内弄到(250,250)处,然后在2秒种内又弄回原位。移位是在这些点中间以线性插值进行的。

3、你也有可能动画一个QObject的值,虽然这些值并没有被声明为Qt属性。唯一的要求就是这个值具有一个setter。之后你可以从这个类派生子类从而包含这些值并且声明一个使用这个setter的属性。注意每个Qt属性都需要有一个getter,所以你需要提供一个getter,如果它不存在的话。

class MyGraphicsRectItem : public QObject, public QGraphicsRectItem

{

Q_OBJECT

Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry)

};

在上例中,我们派生了QGraphicsRectItem并定义了一个geometry属性。我们现在可以动画这个widget的geometry了,即使QGraphicsRectItem没有提供geometry属性。

  • 动画和图形视图框架

当你想动画QGraphicsItems,你也要用QPropertyAnimation。然而,QGraphicsItem不是从QObject派生的。一个好的解决方案是派生要动画的图形item。派生类也要从QObject派生。这样,QPropertyAnimation就可以被用于QGraphicsItems了。

class Pixmap : public QObject, public QGraphicsPixmapItem

{

Q_OBJECT

Q_PROPERTY(QPointF pos READ pos WRITE setPos)

...

就如上一节中所讲的,我们需要定义希望去动画的属性。

注意:QObject必须是继承中的第一个,因为元数据对象系统需要这样做。

  • 宽松曲线

QPropertyAnimation在属性的开始值和结束值之间执行一个插值运算。除了向动画添加更多的关键值外,你还可以使用一个宽松曲线。宽松曲线描述了一个在0和1之间插值的速度变化的函数,如果你想控制一个动画的速度而不改变插值的路径时,就非常有用。

animation1 = new QPropertyAnimation(ui.pushButton, "geometry");

animation1->setDuration(10000);

animation1->setStartValue(QRect(0, 0, 0, 0));

animation1->setEndValue(QRect(250, 250, 100, 30));

animation1->setEasingCurve(QEasingCurve::OutBounce);

这里,动画将按照一个曲线进行,这个曲线使得动画像一个跳动的皮球从开始位置跳到结束位置。QEasingCurve具有一个大曲线集合,你可以从里面选择一个。它们被定义为QEasingCurve::Type枚举。如果你需要不一样的曲线,你也可以自己实现一个,然后注册到QEasingCurve。

  • 错误1:QPropertyAnimation: you‘re trying to animate a non-existing property 属性窗口

解释:

animation1 = new QPropertyAnimation(ui.pushButton, "geometry");

估计是你给的属性名字(propertyName)是错误的,必须是qt自带的属性名字,或者你通过自定义实现的名字。

我要是把代码写成:

animation1 = new QPropertyAnimation(ui.pushButton, "geometry23");

会提示如下错误,找不到属性geometry23

QPropertyAnimation: you‘re trying to animate a non-existing property setGeometry23 of your QObjec

时间: 2024-10-25 08:04:24

Qt动画架构中的主要类的相关文章

Qt动画与Qt坐标小记

Qt动画 转载自: <http://jingyan.baidu.com/article/154b46315757b628ca8f4116.html> 和  <http://blog.csdn.net/syzobelix/article/details/9377863> Qt动画架构中的主要类如下图所示: 动画框架由基类QAbstractAnimation和它的两个子类QVariantAnimation和QAnimationGroup组成. QAbstractAnimation是所有

Qt 中一些常用类中文说明

Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进制的数据 QDataWidgetMapper 提供了从数据模型到部件的映射 QData 日期的功能 QDateEdit 提供了日期的部件用来编辑日期,是基于QDateTimeEdit 部件 QDateTime 提供日期与时间的功能 QDateTimeEdit 提供了编辑日期与实践的部件 QDBusA

第十一课、Qt中的字符串类

一.历史遗留的问题及解决方案 1.遗留的问题 (1).C语言不支持真正意义上的字符串 (2).C语言用字符数组和一组函数实现字符串操作 (3).C语言不支持自定义类型,因此无法获得字符串类型 2.解决方案 (1).从c到c++进化过程中引入了自定义类型 (2).在c++中可以通过类来完成字符串的定义 3.标准库STL (1).STL是意义上需要与c++一同发布的标准库 (2).STL是一套以模板技术完成的c++类库 (3).STL包含了常用的算法和数据结构 (4).STL包含了字符串类 4.Qt

QT之在QML中使用C++类和对象

QML其实是对ECMAScript的扩展,融合了Qt object系统,它是一种新的解释性语言,QML引擎虽然由Qt C++实现,但QML对象的运行环境说到底和C++对象的上下文环境是不通的,是平行的两个世界,如果想在QML中访问C++对象,那么必然要找到一种途径在两个运行环境之间建立沟通的桥梁. Qt提供了两种在QML环境中使用C++对象的方式: (1)在C++中实现一个类,注册为QML环境的一个类型,在QML环境中使用该类型创建对象 (2)在C++中构造一个对象,将这个对象设置为QML的上下

QT动画介绍(有例子可以下载)

所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情.当然做这件事情,最好用的就是状态机,点击这里查看Qt使用状态机实现动画效果实例. 不过,实现动画也有更简单的方法,Qt提供了QStateMachine类,应用该类可以快速的实现动画效果. Qt动画三字诀: 第一决:QPropertyAnimation QPropertyAnimation用于和QObject中的属性properties进行通信,比如QWidget的大小,位置坐标等.来看代码 1 2

Qt动画窗口,Qt之对话框消失动画

在讲解代码之前,先来认识几个概念 QPropertyAnimation:属性动画,可以参考qt 窗口动画 QGraphicsOpacityEffect:窗口透明度设置类,继承自QGraphicsEffect QGraphicsDropShadowEffect:窗口阴影,继承自QGraphicsEffect QGraphicsBlurEffect:滤镜,继承自QGraphicsEffect QGraphicsColorizeEffect:着色,继承自QGraphicsEffect http://w

css3中关于伪类的使用

目标: css中after伪类,last-child伪类的使用.以及部分css3的属性. 过程: 在制作导航时,经常会遇到在每一个li后面添加一个分割符号,到最后一个元素的时候,分割符就会去掉的一种效果. 如图 那么制作这样的一个效果,怎么用纯css很简单的完成了.这里用到了css的伪类. html部分 <body> <ul class="nav"> <li><a href="">Home</a></

UML基本架构建模--类的辅助信息

 Organizing Attributes and Operations 组织属性和操作 When drawing a class, you don't have to show every attribute and every operation at once. In fact, in most cases, you can't (there are too many of them to put in one figure) and you probably should not

Android4.2.2下Stagefright多媒体架构中的A31的OMX插件和Codec组件

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email: [email protected] 在前面的博文中提到,AwesomePlayer::onPrepareAsyncEvent()开始进行Codec解码器组件的获取以及创建,这里和大家分享. 1.以解码器实例作为切入点 status_t AwesomePlayer::initVideoDecoder(uint32_t flags) { ATRACE_CALL(); ...... ALOG