首页 > 其他分享 >QT中的动画类(QPropertyAnimation)

QT中的动画类(QPropertyAnimation)

时间:2023-06-09 12:32:25浏览次数:47  
标签:动画 QT QPropertyAnimation 50 animation 设置 属性

(文章目录)


前言

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对象,并设置其初始位置。

QPushButton *pushButton = new QPushButton("Click me", this);
pushButton->setGeometry(50, 50, 100, 40);

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

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

3.启动动画。

animation->start();

完整的示例代码如下:

QPushButton *pushButton = new QPushButton("Click me", this);
pushButton->setGeometry(50, 50, 100, 40);

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

animation->start(); // 启动动画

2.QPropertyAnimation修改QPushButton的geometry属性

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

QPushButton *pushButton = new QPushButton("Click me", this);
pushButton->setGeometry(50, 50, 100, 40);

QPropertyAnimation *animation = new QPropertyAnimation(pushButton, "geometry");
animation->setDuration(1000); // 设置动画持续时间为1秒
animation->setStartValue(QRect(50, 50, 100, 40)); // 设置起始位置和大小
animation->setEndValue(QRect(200, 50, 100, 40)); // 设置结束位置和大小,即横向向右平移150像素

animation->start(); // 启动动画

三、QPropertyAnimation修改自定义属性

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

自定义属性方式:

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

通过READ和WRITE标识定义两个函数,功能分别是获取自定义属性的值和修改自定义属性的值。 NOTIFY标识一个信号量,当自定义属性发生改变时可以发送这个信号量。

    /*定义一个可读(READ)并且可写(WRITE)的属性,并且可以通过属性名称进行访问*/
    Q_PROPERTY(int endAngle READ endAngle WRITE setEndAngle NOTIFY endAngleChanged)

public:
    int endAngle() const { return m_endAngle; }
    void setEndAngle(const int& endAngle) { m_endAngle = endAngle; update(); }

signals:
    void endAngleChanged(int Angle);



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

    animation = new QPropertyAnimation(this, "endAngle");
    animation->setDuration(500);
    animation->setStartValue(0); // 属性的起始值
    animation->setEndValue(100); // 属性的结束值
    
    // 启动动画
    animation->start();

四、疑问点

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

解惑:

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

总结

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

标签:动画,QT,QPropertyAnimation,50,animation,设置,属性
From: https://blog.51cto.com/u_16153875/6446759

相关文章

  • QT Error
    环境:QT6.5,VS2022,QTVisualStudioTool2.10.11.QTCustomDesignerWidget无法显示到WidgetBox中的解决方案:QDESIGNER_WIDGET_EXPORT需要将生成的dll和lib放置到目录D:\Qt\6.5.1\msvc2019_64\plugins\designer下,重启QT即可。#include<QtWidgets/QWidget>#incl......
  • Wpf(Storyboard)动画简单实例
    Wpf(Storyboard)动画简单实例动画的三种变换方式RotateTransform:旋转变换变化值:CenterX围绕转的圆心横坐标      CenterY纵坐标       Angle旋转角度(角度正负表示方向) ScaleTransform:缩放变换变化值:ScaleX横向放大倍数 ScaleY纵向(负值时翻转)  TranslateTransform......
  • Qt MDI及其使用方法(详解版)
    统的应用程序设计中有多文档界面(Multi-documentInterface,MDI)应用程序,Qt为设计MDI应用程序提供了支持。本节的实例samp6_4是一个MDI应用程序,程序运行效果如图1所示。 图1MDI应用程序实例samp6_4的运行时界面MDI应用程序就是在主窗口里创建多个同类型的MDI子窗口......
  • Qt元对象和属性系统详解
    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。本节将介绍Qt的这些核心特点,对于理解和编写高效的QtC++程序是大有帮助的。 Qt的元对象系统Qt的元对象系统(Meta-ObjectSystem)提供......
  • Linux下Qt创建共享库与链接共享库详解
    随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库;或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库。本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的方法。 共享库是在Linux下的称呼,在Windows下被称为动态库。这块大家需要了解的是......
  • qt work
    autofolder1="./.mm";QDir*folder=newQDir;boolexist=folder->exists(folder1);if(exist){QMessageBox::warning(this,tr("createDir"),tr("Dirisalreadyexisted!"));}......
  • [Animations] 快速上手 iOS10 属性动画
    概述今天要说的UIViewPropertyAnimator,是iOS10新的API详细基础动画,核心动画到自定义转场动画其实都不是什么新东西了,所以我也是草草看一遍就能够读个大概,但今天要说的UIViewPropertyAnimator,是iOS10新的API,其他的好处我还不太清楚,但抽象动画逻辑和监控......
  • 让一张图片从模糊慢慢变清晰动画过程
    importjava.io.IOException;importjava.io.InputStream;importandroid.app.Activity;importandroid.content.Context;importandroid.content.res.AssetManager;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.os.Bundle;......
  • 使用ActivityOptions做Activity切换动画
    不知道大家有没有注意到startActivity(Intent,Bundle),那么ActivityOptions就是这个Bundle的原型,负责Activity跳转时的动画。publicvoidonClick(Viewview){Intentintent=newIntent(this,SecondActivity.class);ActivityOptionsoptions=Act......
  • CreateJS 动画 EaselJS 动画
    本节将介绍创建图形动画,精灵表位图动画,DOM元素动画.例子1图形动画<!DOCTYPEhtml><html><head> <metacharset="gbk"> <scripttype="text/javascript"src="easeljs-0.6.0.min.js"></script></head><body> &l......