QT动画实例代码QPropertyAnimation的应用

news2024/11/17 20:49:10

用QT实现动画,我们必定用到QPropertyAnimation,这里我们介绍几种情形的动画实现。如直线动画,曲线动画,路径动画。

一、基础知识

1、QPropertyAnimation的初始化

我们首先必须在包涵QPropertyAnimation的头文件或者模块,否则报错不能识别。我们来实例化一个,下面是类的构造函数:

  QPropertyAnimation(QObject *target, const QByteArray &propertyName, QObject *parent = nullptr);

很显然,它有三个参数,所以我们可以带参初始化:
target:要实施动画的对象,可以是widget对象或子对象,自定义的图形对象;
propertyName:这里是一个描述字符串常量,“pos” 、“opacity ”、“geometry”,“sacleFactor”,分别控制位置、透明度、形状,大小;
parent:可以不填写,它有默认值为nullptr;
下面是初始化构造函数的举例:

QPropertyAnimation * animation=QPropertyAnimation(targetObject,“pos”);//pos  opacity geometry

我们根据需要选择pos 、opacity 、geometry中的任何一个。

当然,我们也可以不带参在构造函数实例化,而是空置构造函数的参数列表,然后用属性设置来设置这些参数:
setTargetObject:设置仿真对象
setPropertyName:设置仿真属性的名称

QPropertyAnimation * animation=QPropertyAnimation();
animation->setTargetObject(this);
animation->setPropertyName("pos");

2、设置运动属性参数

运动属性参数主要
setDuration:设置仿真持续的时间
setStartValue:设置初始值
setEndValue:设置结束值
setKeyValueAt:设置关键点的值

  animation->setDuration(4000);
  animation->setStartValue(QPoint(30, 30));
  animation->setEndValue(QPoint(350, 30));
  

上面的代码我们设置了起点和终点。如果我们只是做简单的两种状态的动画,这已经足够了,如果是多个状态(这里的状态可以是位置、形状、透明度),那么我们就要借助另一个参数属性设置方法。

3、多状态点运动参数设置setKeyValueAt[关键帧]

setKeyValueAt的设置一般有两个参数,但官网和论坛中可以找到的说明都很少,这里详细说一下:
在这里插入图片描述
step:表示状态变化的程度0~1,表示0%到100%,当设置为1时就表示动画结束了。
value:它是一个QVariant类型,QPoint对应pos,QRect对应geometry,单个数值对应opacity 或者sacleFactor

animation->setKeyValueAt(0.5,QPoint(200,200));

如果我们要批量设置多状态点运动参数即关键帧,我们可以直接使用setKeyValues来完成,这里不再赘述,这和setKeyValueAt的数据对一样,只不过是数组而已;

到这里,一个动画需要的关键参数设置都已经完成了。

二、实例

1、简单直线动画

QPropertyAnimation * animation=QPropertyAnimation(targetObject,“pos”)
  animation->setDuration(4000);
  animation->setStartValue(QPoint(30, 30));
  animation->setEndValue(QPoint(350, 30));
  animation->start();

这里的targetObject可以是窗体或者是任何图形对象;

2、多状态点[关键帧]

位置动画,那么就是设置不同的动画百分比和点坐标,如下:

QPropertyAnimation * animation1=QPropertyAnimation(targetObject,“pos”)
 animation1->setStartValue(QPoint(0, 0));
 animation1->setKeyValueAt(0.25, QPoint(250, 0));
 animation1->setKeyValueAt(0.50, QPoint(250, 250));
 animation1->setKeyValueAt(0.75, QPoint(0, 250));
 animation1->setKeyValueAt(0.99, QPoint(0, 0));
 animation1->setEndValue(QPoint(0, 0));
 animation1->start(QAbstractAnimation::KeepWhenStopped);

形状动画,设置不同的动画百分比和矩形特征

QPropertyAnimation * animation1=QPropertyAnimation(targetObject,“pos”)
  animation1->setDuration(3000);
   animation1->setKeyValueAt(0, QRect(0, 0, 00, 00));
   animation1->setKeyValueAt(0.4, QRect(250, 0, 0, 0));
   animation1->setKeyValueAt(0.8, QRect(250, 250, 0, 0));
   animation1->setKeyValueAt(0.9, QRect(0, 250, 0, 0));
   animation1->setEndValue(QRect(0, 0, 0, 0));
   animation1->start();

3、路径动画

路径动画需要一路径QPainterPath,这个大家可以先参考学习QPainterPath;有了路径后我们就可以绘制路径动画了,我们依旧要使用setKeyValueAt:

QPropertyAnimation * animation1=QPropertyAnimation(targetObject,“pos”)
animation->setDuration(4000);
animation->setStartValue(QPoint(30, 30));
for (int i=0;i<101;i++)
     animation->setKeyValueAt(i/100, path.pointAtPercent(i));
     //这里的path我们事先已经绘制好了
animation->setEndValue(QPoint(350, 30));
animation->start();

三、用出高级感来

1、更多的QPropertyAnimation 属性方法

我们要把QPropertyAnimation 用出高级感来,那必须熟悉更多的QPropertyAnimation 的属性方法,如:
setEasingCurve:设置擦除模式
currentValue:返回当前值
valueChanged:只要仿真追踪的值发生变化,就发送该信号

2、上下游与之相关的类

还有与QPropertyAnimation 相关的上下游的类如:
QPauseAnimation
QVariantAnimation

3、多动画的并行和串行

AnimationGroup:多个动画AnimationGroup可以加入这个类实现多动画的并行和串行播放
QParallelAnimationGroup:并行播放组类
QSequentialAnimationGroup:串行播放组类
首先,我们来看看串行的动画组QSequentialAnimationGroup :

QSequentialAnimationGroup *group = new QSequentialAnimationGroup(this);
QPropertyAnimation * animation1=QPropertyAnimation(targetObject,“pos”);
QPropertyAnimation * animation2=QPropertyAnimation(targetObject,“pos”);
QPropertyAnimation * animation3=QPropertyAnimation(targetObject,“pos”);
QPropertyAnimation * animation4=QPropertyAnimation(targetObject,“pos”);
//这里略去了具体每个动画的内容
  group->addAnimation(animation1);
  group->addAnimation(animation2);
  group->addAnimation(animation3);
  group->addAnimation(animation4);
  group->setLoopCount(4);//根据需要设置循环次数,-1时为无限次循环
  group->start();
      

例如,我们要做一个尺寸和透明度同时变化的动画,那么就应该使用QParallelAnimationGroup

QParallelAnimationGroup *group = new QParallelAnimationGroup(this);

    //尺寸变化动画
  QPropertyAnimation * mscaleAnimation = new QPropertyAnimation(this, "sacleFactor");
    sAnimation->setDuration(3000);
    sAnimation->setStartValue(0.1);
    sAnimation->setEndValue(1.0);
    sAnimation->setEasingCurve(QEasingCurve::OutQuad);
    group->addAnimation(sAnimation);

    //透明度变化动画
    QPropertyAnimation *fAnimation= new QPropertyAnimation(this, "opacity");
    fAnimation->setDuration(3000);
    fAnimation->setStartValue(1);
    fAnimation->setEndValue(0.1);
    fAnimation->setEasingCurve(QEasingCurve::OutQuad);
    group->addAnimation(fAnimation);
    group->start();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android之WorkManager处理后台定时任务

WorkManager和Service并不相同&#xff0c;也没有直接的联系。Service是Android系统四大组件之一&#xff0c;它没有被销毁的情况下是一直保持在后台运行的。而WorkManager只是一个处理定时任务的工具&#xff0c;它可以保证即使在应用退出甚至手机重启的情况下&#xff0c;之前…

动手深度学习-pytorch数据操作

N维数组是机器学习和神经网络的主要数据结构创建数组需要形状&#xff1a;如3*4的矩阵每个元素的类型&#xff1a;例如32位浮点数每个元素的值&#xff1a;例如全是0.或者随机数数据操作首先&#xff0c;导入torch张量表示一个数值组成的数组&#xff0c;这个数组可能有多个维度…

acwing基础课——欧拉函数

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板4——数学知识 - AcWing 基本思想&#xff1a; 这里我们了解一下欧拉函数是什么以及用筛法求欧拉函数&#xff0c;我们先给出欧拉函数的定义&#xff1a; 然后我们了解一下互质的概念&#xff0c;只要两数的公因…

连你女朋友都能看懂的分布式架构原理!

目录 从一个新闻门户网站案例引入推算一下你需要分析多少条数据&#xff1f;黄金搭档&#xff1a;分布式存储分布式计算 这篇文章聊一个话题&#xff1a;什么是分布式计算系统&#xff1f; 一、从一个新闻门户网站案例引入 现在很多同学经常会看到一些名词&#xff0c;比如分…

CSDN官方模板

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

数据结构(栈)

目录 栈的定义 形象比喻 栈的相关术语 栈的抽象数据类型&#xff08;栈Stack的ADT&#xff09; 顺序栈 顺序栈类的声明 顺序栈类成员函数的实现 基本效率分析 顺序栈的应用&#xff08;小测试&#xff09; main.cpp 共享栈 双共享栈 链式栈 链式栈基本操作分析 链…

cf Educational Codeforces Round 134 E. Prefix Function Queries

原题&#xff1a; You are given a string s, consisting of lowercase Latin letters. You are asked q queries about it: given another string t, consisting of lowercase Latin letters, perform the following steps: concatenate s and t; calculate the prefix func…

实战打靶集锦-001-Funbox2

**写在前面&#xff1a;**这应该是本人第一次自主成功完成的打靶&#xff0c;纪念一下下。 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Apache探查4.1.1 浏览器访问4.1.2 站点地图查看4.1.3 目录枚举4.1.4 公共EXP搜索4.2 FTP探查4.2.1 手工登录FTP4.2.2 公共EXP搜索…

基于决策树模型和支持向量机模型的手写数字识别

目录 1、导入库和手写数字数据集 2、 把数据可视化 3、把数据分成训练数据集和测试数据集 4、训练SVM模型 5、训练决策树模型 6、对所使用的模型进行评估 7、对手写数字图像进行预测 本项目实现了 第一个功能&#xff1a;可以通过导入库和数据集、通过对数据集的预处理…

JavaScript基础(17)_Function方法(call、apply)、arguments

概念 call&#xff0c;apply都属于Function.prototype的一个方法&#xff0c;它是JavaScript引擎内在实现的&#xff0c;因为属于Function.prototype&#xff0c;所以每个Function对象实例(就是每个方法)都有call&#xff0c;apply属性&#xff0c;可以通过函数对象来调用。 a…

2023牛客寒假算法基础集训营3 赛时思路+正解

这场数学和思维偏多&#xff0c;特别是数学&#xff0c;五个小时过于充实了&#xff0c;而且更加考验你的心态。 这场不乏码量大的毒瘤题&#xff0c;也不乏人类智慧妙妙题。 A 不断减损的时间 题意 给定一个数组aaa&#xff0c;我们可以执行任意次操作&#xff0c;该操作定义…

Rethinking Performance Gains in Image Dehazing Networks

论文源码&#xff1a;https://download.csdn.net/download/zhouaho2010/87393184 Abstract 图像去雾是低层视觉中的一个活跃话题&#xff0c;随着深度学习的快速发展&#xff0c;许多图像去雾网络被提出。尽管这些网络的工作良好&#xff0c;但提高图像去雾性能的关键机制仍不…

守望者的逃离

题目说明【问题描述】恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵&#xff0c;率深藏在海底的那加企图叛变&#xff1a;守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者&#xff0c;尤迪安开始对这个荒岛施咒&#xff0c;这座岛很快就会沉下去&#…

【java入门系列五】java基础-面向对象**

学习记录&#x1f914;类与对象内存中的布局堆栈成员方法 类内的函数传参机制传进来的是一个数组/对象&#xff0c;类似于py的list调用递归-在栈空间方法递归汉诺塔八皇后方法重载overload可变参数作用域**scope构造器/构造方法&#xff1a;新对象的初始化构造器细节对象创建流…

pytorch 笔记:torch.nn.init

这个模块中的所有函数都是用来初始化神经网络参数的&#xff0c;所以它们都在torch.no_grad()模式下运行&#xff0c;不会被autograd所考虑。 1 计算gain value 1.1 介绍 这个在后面的一些nn.init初始化中会用到 1.2 用法 torch.nn.init.calculate_gain(nonlinearity, para…

【LeetCode】回溯算法总结

回溯法解决的问题 回溯法模板 返回值&#xff1a;一般为void参数&#xff1a;先写逻辑&#xff0c;用到啥参数&#xff0c;再填啥参数终止条件&#xff1a;到达叶子节点&#xff0c;保存当前结果&#xff0c;返回遍历过程&#xff1a;回溯法一般在集合中递归搜索&#xff0c;集…

使用DiskGenius进行硬盘数据迁移

克隆硬盘 - DiskGenius 1.迁移磁盘 选择自己想要迁移的磁盘&#xff0c;点击工具-克隆磁盘 首先选择源硬盘&#xff0c;点击确定 之后选择想要迁移到的硬盘&#xff0c;点击确定 检查一下原硬盘和目标硬盘是否正确&#xff0c;此外还可以对这个空间进行二次调整。最终如果没有…

Android 中关于 FileObserver类监听文件状态的实践

文章目录需求背景走进源码实现示例参考需求背景 当某一个目录的文件发生变化&#xff08;创建、修改、删除、移动&#xff09;时&#xff0c;需要给一个回调事件给其他端调用。 其他场景&#xff1a;阅后即焚等等。 比如在 Android 的 VR 设备中&#xff0c;有一个用于部署的文…

Oracle P6 Professional专业版 22.12 中的热门新功能

目录 并排查看项目 在复制与 WBS 元素的关系时具有更大的灵活性 更轻松地确定要分配的正确基线 复制并粘贴电子表格中的单元格区域 更好地控制导入数据 检查 P6 专业版中提供的时间表报告 在排序对话框中排列字段顺序 创建导入和导出模板的副本 指定完成日期筛选器如何…

光流估计(一) 光流的简介与操作

今天是大年29&#xff0c;明天要贴春联了&#xff01;算是在年前赶出来一篇文章发&#xff08;太长时间没发东西了O。o&#xff09;&#xff0c;也算是自己在光流估计深度学习部分研究的开始~ 明年开学就是研二下学期了&#xff0c;时间过得飞快&#xff0c;毕设、实习、工作等…