Qt动画效果的实现,QPropertyAnimation

  • 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 QObject

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Qt可以使用QPropertyAnimation类来实现动画移动效果。QPropertyAnimationQt提供的属性动画类之一,可以用于控制目标对象的属性值,从而实现动画效果。 下面是一个简单的例子,演示如何使用QPropertyAnimation实现一个窗口从左向右移动的动画效果: ```cpp // 创建一个QWidget对象 QWidget *widget = new QWidget(); // 创建一个QPropertyAnimation对象 QPropertyAnimation *animation = new QPropertyAnimation(widget, "pos"); // 设置动画持续时间为2秒钟 animation->setDuration(2000); // 设置起始位置为(0,0) animation->setStartValue(QPoint(0, 0)); // 设置结束位置为(200,0) animation->setEndValue(QPoint(200, 0)); // 启动动画 animation->start(); ``` 上述代码中,首先创建了一个QWidget对象,然后创建了一个QPropertyAnimation对象,并将其绑定到QWidget对象的pos属性上。接下来,设置了动画的持续时间为2秒钟,起始位置为(0,0),结束位置为(200,0),最后启动动画。 需要注意的是,QPropertyAnimation的构造函数接受两个参数:目标对象和目标属性。在本例中,目标对象为widget,目标属性为pos,因此该动画将控制widget对象的位置属性。 除了控制QWidget对象的位置属性外,还可以控制其它属性,例如大小、透明度等。只需将目标属性设置为相应的属性名称即可。 ```cpp // 创建一个QWidget对象 QWidget *widget = new QWidget(); // 创建一个QPropertyAnimation对象 QPropertyAnimation *animation = new QPropertyAnimation(widget, "geometry"); // 设置动画持续时间为2秒钟 animation->setDuration(2000); // 设置起始大小为(100,100) animation->setStartValue(QRect(0, 0, 100, 100)); // 设置结束大小为(200,200) animation->setEndValue(QRect(0, 0, 200, 200)); // 启动动画 animation->start(); ``` 上述代码中,将目标属性设置为geometry,以控制QWidget对象的大小属性。 ### 回答2: 在Qt中,可以通过QPropertyAnimation类来实现动画移动效果。以下是一个简单的例子: ```cpp #include <QApplication> #include <QLabel> #include <QPropertyAnimation> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个label控件 QLabel label("Hello, Qt!"); label.show(); // 创建一个动画对象,指定要移动的目标对象和属性名 QPropertyAnimation animation(&label, "pos"); // 设置动画的起始值和结束值 animation.setStartValue(QPoint(100, 100)); animation.setEndValue(QPoint(200, 200)); // 设置动画的持续时间,单位为毫秒 animation.setDuration(2000); // 启动动画 animation.start(); return app.exec(); } ``` 在上面的代码中,创建了一个QLabel控件,然后创建了一个QPropertyAnimation对象,指定了要移动的目标对象为label控件的位置(pos)属性。然后设置了动画的起始值和结束值,以及动画的持续时间。最后通过调用`start()`方法启动了动画。 在运行程序时,label控件将会在2秒钟内从起始位置(100,100)平滑地移动到结束位置(200,200)。 除了位置属性(`pos`),Qt还提供了其他属性可以进行动画操作,如大小(`size`)、透明度(`opacity`)等。可以通过指定不同的属性名来实现不同的动画效果。 ### 回答3: Qt提供了一种简洁而强大的方式来实现动画移动效果,以下是具体实现步骤: 1. 首先,我们需要在Qt的工程文件中包含QPropertyAnimation类的头文件,该类用于实现对象的属性动画效果。 2. 创建需要进行动画移动的对象,并设置好初始位置和大小等属性。 3. 创建一个QPropertyAnimation对象,并设置要进行动画的对象以及需要进行动画的属性。 4. 设置动画的起始值和结束值,可以使用setStartValue和setEndValue来设置。 5. 设置动画的持续时间,可以使用setDuration来设置动画的时间长度。 6. 设置动画的缓动曲线,可以使用setEasingCurve来选择不同的动画曲线。 7. 如果有需要,可以设置循环次数、循环模式以及反向运动等属性。 8. 启动动画,可以使用start方法来启动动画效果。 9. 可以使用QAnimationGroup类来同时管理多个动画。 10. 如果需要处理动画的进度或者动画完成后的操作,可以使用信号和槽机制来处理。 需要注意的是,为了使动画能够在界面上显示出来,需要在Qt的事件循环中使用exec()或者在定时器中调用update()函数,以便引发重绘事件。 总的来说,Qt的QPropertyAnimation类提供了丰富的功能来实现动画移动效果,通过设置不同的参数和属性,可以灵活地控制动画效果和表现形式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值