Qt 动画类(QPropertyAnimation)


前言
  QPropertyAnimation是QT中的一个动画类,用于对目标对象的属性进行动画效果展示。该类继承自QAbstractAnimation类,使用起来非常方便和灵活。

一、QPropertyAnimation类介绍
  QPropertyAnimation可以对任何QObject的子类的属性进行动画的展示,只要该属性是可写的,即存在set方法。QPropertyAnimation支持多种类型的属性,例如整型,浮点型,颜色等。要使用QPropertyAnimation,需要创建一个QPropertyAnimation对象,并通过setTargetObject方法将要动画显示的对象设置为目标对象,通过setPropertyName方法设置要动画显示对象的属性名。

  可以使用QVariant类型的setStartValue()和setEndValue()方法设置动画的起始值和结束值,也可以设置一个QValueSource类型的值源作为动画的值,通过setStartValueSource()和setEndValueSource()方法设置动画的值源。

  调用start函数开始执行动画,QPropertyAnimation能够自动计算动画的时间,执行时间和动画的重复次数等等。可以通过信号和槽机制来监测动画的进度和状态,例如valueChanged()信号可以获得动画实时的数值。

二、QPropertyAnimation使用例子

1.QPropertyAnimation修改QPushButton的pos属性
  这里给出平移一个按键的动画例子:

  下面的代码主要就是使用QPropertyAnimation来修改QPushButton类中的pos属性值让按键实现平移的效果。

1.创建QPushButton对象,并设置其初始位置。

1 QPushButton *pushButton = new QPushButton("Click me", this); 2 pushButton>setGeetry(50, 50, 100, 40);

2.创建QPropertyAnimation对象,并设置变化的属性、持续时间、起始值和结束值。

1 QPropertyAnimation *animation = new QPropertyAnimation(pushButton, "pos"); 2 animation>setDuration(1000); // 设置动画持续时间为1秒 3 animation>setStartValue(QPoint(50,50)); // 设置起始位置为(50,50) 4 animation>setEndValue(QPoint(200, 50)); // 设置结束位置为(200,50),即向右平移150像素

3.启动动画。

animation>start();

完整的示例代码如下:

1 QPushButton *pushButton = new QPushButton("Click me", this); 2 pushButton>setGeetry(50, 50, 100, 40); 3 4 QPropertyAnimation *animation = new QPropertyAnimation(pushButton, "pos"); 5 animation>setDuration(1000); // 设置动画持续时间为1秒 6 animation>setStartValue(QPoint(50,50)); // 设置起始位置为(50,50) 7 animation>setEndValue(QPoint(200, 50)); // 设置结束位置为(200,50),即向右平移150像素 8 9 animation>start(); // 启动动画

2.QPropertyAnimation修改QPushButton的geetry属性

  上面的第一个代码通过修改pos属性来达到动画的效果,同样的也可以通过修改geetry属性来达到动画的效果。

1 QPushButton *pushButton = new QPushButton("Click me", this); 2 pushButton>setGeetry(50, 50, 100, 40); 3 4 QPropertyAnimation *animation = new QPropertyAnimation(pushButton, "geetry"); 5 animation>setDuration(1000); // 设置动画持续时间为1秒 6 animation>setStartValue(QRect(50, 50, 100, 40)); // 设置起始位置和大小 7 animation>setEndValue(QRect(200, 50, 100, 40)); // 设置结束位置和大小,即横向向右平移150像素 8 9 animation>start(); // 启动动画

三、QPropertyAnimation修改自定义属性
  除了修改QWidget和QGraphicsItem之类的内置属性之外,QPropertyAnimation还可以使用自定义属性。

自定义属性方式:

  在这里,我们使用了Q_PROPERTY宏来声明自定义属性。这个宏有三个参数:属性名、属性类型和可读可写属性的函数名称。

  通过READ和WRITE标识定义两个函数,功能分别是获取自定义属性的值和修改自定义属性的值。

  NOTIFY标识一个信号量,当自定义属性发生改变时可以发送这个信号量。

1 /*定义一个可读(READ)并且可写(WRITE)的属性,并且可以通过属性名称进行访问*/ 2 Q_PROPERTY(int endAngle READ endAngle WRITE setEndAngle NOTIFY endAngleChanged) 3 4 public: 5 int endAngle() const 6 void setEndAngle(const int& endAngle) 7 8 signals: 9 void endAngleChanged(int Angle);

使用:
  使用setStartValue可以设置属性的起始值,使用setEndValue设置结束值。

1 animation = new QPropertyAnimation(this, "endAngle"); 2 animation>setDuration(500); 3 animation>setStartValue(0); // 属性的起始值 4 animation>setEndValue(100); // 属性的结束值 5 6 // 启动动画 7 animation>start();

四、疑问点
  这里并没有显示的调用读取属性函数和设置属性函数,那么他们是怎么生效的呢?
  在上面的程序中我们使用的是QPropertyAnimation中的setStartValue函数和setEndValue函数来设置属性的起始值和属性的结束值,这样看起来是没有调用到我们自己定义的函数,其实调用这两个函数是会调用到我们自己设置的函数的。

解惑:

  setStartValue 函数会调用 MyWidget 中 endAngle 属性的 READ 函数,获取当前的 endAngle 值作为动画起始值。而 setEndValue 函数则直接调用 setEndAngle 函数,间接设置自定义属性的结束值。

总结
  在实际应用中,QPropertyAnimation可以让程序动态变得更加生动,提高用户的体验感,是一个非常有用的QT类。



上一篇:Qt 等待提示框(QMovie)

下一篇:Qt 等待提示框(QTimer)


Qt
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图