Qt下使用动画框架实现动画520

news2024/11/29 10:45:52

文章目录

  • 前言
  • 一、动画框架的介绍
  • 二、示例完整代码
  • 三、QtCreator官方示例
  • 总结


前言

文章中引用的内容均来自这本书中的原文:【Qt Creator快速入门_霍亚飞编著】。可以通过更改本文示例pro文件中的条件编译,运行示例1和示例2来查看串行动画组和并行动画组的区别,希望可以帮助到大家,如有错误之处,欢迎大家批评指正。

下面项目是并行动画组的效果展示:
项目效果
请添加图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、动画框架的介绍

动画框架:其目的是提供一种简单的方法来创建平滑的、具有动画效果的 GUI界面。该框架是通过控制 Qt的属性来实现动画的,它可以应用在窗口部件和其他 QObject对象上,也可以应用在图形视图框架中

属性动画:QPropertyAnimation类可以对Qt属性进行插值,可以使用函数setStartValue()和setEndValue()设置属性开始和结束的值,还可以调用setKeyValueAt()函数在动画中间为属性设置值

缓和曲线:可以使用setEasingCurve()函数设置部件运动的缓和曲线,QEasingCurve类中提供了四十多种缓和曲线,详细可以查看该类的帮助文档

动画组:在一个应用中经常会包含多个动画,例如要同时移动多个图形项或者让它们一个接一个的串行移动。使用QAnimationGroup类可以实现复杂的动画,它的两个子类QSequentialAnimationGroupQParallelAnimationGroup分别提供了串行动画组和并行动画组

二、示例完整代码

1.MyAnimation.pro

QT += widgets

SOURCES += \
    main.cpp \

#条件编译
#DEFINES += EXAMPLE_1
DEFINES += EXAMPLE_2

2.main.cpp

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QPropertyAnimation>
#include <QSequentialAnimationGroup>
#include <QParallelAnimationGroup>
#include <QTimer>
#include <QDebug>

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);

#if EXAMPLE_1
//*****************串行动画组******************
    //新建QWidget类对象
    QWidget *widget = new QWidget();
    widget->setWindowTitle("串行动画");
    widget->setFixedSize(540,320);

    //创建一个按钮
    QPushButton *pb = new QPushButton(widget);

    //为按钮的geometry属性创建动画1
    QPropertyAnimation *animation1 = new QPropertyAnimation(pb,"geometry");
    animation1->setDuration(3000);   //设置动画持续时间,单位ms
    animation1->setStartValue(QRect(0,0,0,0));   //设置属性开始和结束的值
    animation1->setEndValue(QRect(200,150,120,30));
    //animation1->setKeyValueAt(0,QRect(0,0,0,0));   //在动画中间为属性设置值
    //animation1->setKeyValueAt(0.5,QRect(0,0,120,30));
    //animation1->setKeyValueAt(1,QRect(200,150,120,30));
    animation1->setEasingCurve(QEasingCurve::OutBounce);   //使用缓和曲线,这里实现弹跳效果

    //创建动画2
    QPropertyAnimation *animation2 = new QPropertyAnimation(pb,"geometry");
    animation2->setDuration(2000);   //设置动画持续时间,单位ms
    animation2->setStartValue(QRect(200,150,120,30));   //设置属性开始和结束的值
    animation2->setEndValue(QRect(150,120,240,60));
    animation2->setEasingCurve(QEasingCurve::OutBounce);

    //开始串行动画组
    QSequentialAnimationGroup group;
    group.addAnimation(animation1);
    group.addAnimation(animation2);
    group.start();

    //显示界面
    widget->show();

    return app.exec();
#endif

#if EXAMPLE_2
//*****************并行动画组******************
    //新建QWidget类对象
    QWidget *widget = new QWidget();
    widget->setWindowTitle("动画520");
    widget->setFixedSize(540,320);

    //创建动画按钮容器
    QList<QPushButton*> pbList;
    for(int i=0;i<16;i++)
    {
        QPushButton *pb = new QPushButton(widget);
        pbList.append(pb);
    }

    //创建动画开始时的坐标容器
    QList<QRect> startList;
    startList.append(QRect(70,0,0,0));   //组成数字5
    startList.append(QRect(0,50,0,0));
    startList.append(QRect(70,0,0,0));
    startList.append(QRect(0,140,0,0));
    startList.append(QRect(70,0,0,0));
    startList.append(QRect(210,0,0,0));   //组成数字2
    startList.append(QRect(0,50,0,0));
    startList.append(QRect(210,0,0,0));
    startList.append(QRect(0,140,0,0));
    startList.append(QRect(210,320,0,0));
    startList.append(QRect(350,0,0,0));   //组成数字0
    startList.append(QRect(350,320,0,0));
    startList.append(QRect(540,50,0,0));
    startList.append(QRect(540,140,0,0));
    startList.append(QRect(540,50,0,0));
    startList.append(QRect(540,140,0,0));

    //创建动画结束时的坐标容器
    QList<QRect> endList;
    endList.append(QRect(70,50,120,30));   //组成数字5
    endList.append(QRect(70,50,30,120));
    endList.append(QRect(70,140,120,30));
    endList.append(QRect(160,140,30,120));
    endList.append(QRect(70,230,120,30));
    endList.append(QRect(210,50,120,30));   //组成数字2
    endList.append(QRect(300,50,30,120));
    endList.append(QRect(210,140,120,30));
    endList.append(QRect(210,140,30,120));
    endList.append(QRect(210,230,120,30));
    endList.append(QRect(350,50,120,30));   //组成数字0
    endList.append(QRect(350,230,120,30));
    endList.append(QRect(440,50,30,120));
    endList.append(QRect(440,140,30,120));
    endList.append(QRect(350,50,30,120));
    endList.append(QRect(350,140,30,120));

    //创建动画的缓动曲线容器
    QList<QEasingCurve> typeList;
    typeList.append(QEasingCurve::Linear);
    typeList.append(QEasingCurve::InQuad);
    typeList.append(QEasingCurve::OutBounce);
    typeList.append(QEasingCurve::OutInQuad);
    typeList.append(QEasingCurve::InBounce);
    typeList.append(QEasingCurve::InOutQuart);
    typeList.append(QEasingCurve::InOutExpo);
    typeList.append(QEasingCurve::OutInExpo);
    typeList.append(QEasingCurve::InCirc);
    typeList.append(QEasingCurve::OutCirc);
    typeList.append(QEasingCurve::InOutElastic);
    typeList.append(QEasingCurve::OutInElastic);
    typeList.append(QEasingCurve::InOutBack);
    typeList.append(QEasingCurve::OutInBack);
    typeList.append(QEasingCurve::InOutBounce);
    typeList.append(QEasingCurve::OutInBounce);

    //设置各按钮的动画
    QParallelAnimationGroup group;
    for(int i=0;i<16;i++)
    {
        QPropertyAnimation *animation = new QPropertyAnimation(pbList[i],"geometry");
        animation->setDuration(5000);
        animation->setStartValue(startList[i]);
        animation->setEndValue(endList[i]);
        animation->setEasingCurve(typeList[i]);
        group.addAnimation(animation);
    }

    //开始并行动画组
    group.start();

    //显示界面
    widget->show();

    return app.exec();
#endif
}

三、QtCreator官方示例

在QtCreator下的官方示例下有这个图形视图框架与状态机框架使用动画的示例:Animated Tiles Example请添加图片描述

总结

本文中的示例是比较简单的,使用并行动画组实现了一个由按钮部件组成的520形状,在组成这个形状的过程中可以看到各按钮部件的缓和曲线是不一样的,文中有对缓和曲线的介绍。另外还可以在图形视图框架下使用动画,可以参考文中提到的QtCreator官方示例。


hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

学习书籍:【Qt Creator快速入门_霍亚飞编著】

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

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

相关文章

Qt应用开发--国产工业开发板T113-i的部署教程

Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用&#xff0c;因其跨平台性和丰富的功能而备受青睐。 Qt能够为工业领域带来什么好处&#xff1a; - …

基于SSM的网吧计费管理系统(有报告)。Javaee项目,ssm项目。

演示视频&#xff1a; 基于SSM的网吧计费管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通…

Docker容器技术实战4

11、docker安全 proc未被隔离&#xff0c;所以在容器内和宿主机上看到的东西是一样的 容器资源控制 cpu资源限制 top命令&#xff0c;查看cpu使用率 ctrlpq防止退出回收&#xff0c;容器会直接调用cgroup&#xff0c;自动创建容器id的目录 cpu优先级设定 测试时只保留一个cpu…

Spring的总结

SpringFramework 认识SpringFramework 最首先&#xff0c;我们先要认识Spring和SpringFramework两者之间有什么联系&#xff1f; 广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。 狭义的 Spring 特指 Spring Framework&#xff0c;通常我们将它称为 Spr…

Linux多值判断利用case...esac判断

利用这个判断&#xff0c;一定要注意格式的运用&#xff0c;非常容易出错 case $1 in #判断变量的值 "hello") #双引号注意&#xff0c;右括号 echo " afdbab " #语句段&#xff0c;没啥说的 ;; #两个分号结束第一个判断&#xff0c…

python图像处理 ——图像分块

python图像处理 ——图像分块 前言一、分块与合并1.读取原始图像2.网格划分&#xff0c;将图像划分为m*n块3.网格合并 二、代码 前言 根据图像尺寸创建一个 ( m 1 ) ( n 1 ) 个均匀的网格顶点坐标&#xff0c;对于图像块来说每个图像块的左上角和右下角可以唯一确定一个图像…

路由过滤路由引入

目录 一、实验拓扑 二、实验需求 三、实验步骤 1、配置IP地址 2、配置RIP和OSPF 3、配置路由引入 4、使用路由过滤&#xff0c;使 R4 无法学到 R1 的业务网段路由&#xff0c;要求使用 prefix-list 进行匹配 5、OSPF 区域中不能出现 RIP 协议报文 一、实验拓扑 二、实…

【Linux】:Linux项目自动化构建工具——make/Makefile || Linux第一个小程序——进度条(简单版本)

在本章开始给大家分享一个图片 希望对你有帮助 在这里插入图片描述 &#x1f3c6;前言 在开始本章之前 我们需要回顾一下上节课的函数的动静态库的优缺点 动态库的优点&#xff1a; 比较节省资源&#xff08;这里说的资源不仅仅是磁盘资源 也包括网络资源 内存资源等等&#…

SpringBoot项目多环境开发

1.yml文件&#xff08;旧&#xff09; 说明&#xff1a;旧的写法。 #应用环境 spring:profiles:active: dev --- #设置环境#生产环境 spring:profiles: pro server:port: 81--- #开发环境 spirng:profiles: dev server:port: 81--- #测试环境 spring:profiles: test server:p…

修改一下第二次课服务枚举等问题

关于AutoRuns 的总结里面&#xff0c;有个错误&#xff0c;Image hijacks 这个准确的描述应该是镜像劫持 和系统运行相关的image&#xff0c;我们通常指的是二进制镜像文件 Image hijacks镜像劫持 简单来说就是&#xff0c;在注册表中&#xff0c;有部分设置&#xff0c;是规…

阿里云二级域名绑定与宝塔Nginx反向代理配置

在阿里或者腾讯...各大域名商买好域名&#xff0c;备案解析好&#xff0c;目标URL&#xff0c;是真正的地址&#xff0c;比如一些端口&#xff0c;后者会自动填写。 注意ssl配置好&#xff0c;这里不要带反代端口

分享一次无线话筒和接收机的配对经历BK9521/9522

最近老婆喜欢上了唱歌。我就需要为她准备歌曲和设备。装了台点歌机&#xff0c;买了软件&#xff0c;用4天的时间下了4T容量的歌曲&#xff0c;听过的没听过的都在里面&#xff0c;真的是太多了。 有了歌曲&#xff0c;就要有唱歌设备了。当我准备买无线话筒的时候&#xff0c…

Javascript知识点详解:正则表达式

目录 RegExp 对象 概述 实例属性 实例方法 RegExp.prototype.test() RegExp.prototype.exec() 字符串的实例方法 String.prototype.match() String.prototype.search() String.prototype.replace() String.prototype.split() 匹配规则 字面量字符和元字符 转义符…

5.数据表基本操作

目录 1.创建数据表 创建数据表的语法格式&#xff1a; 查看当前数据库的表&#xff1a; 主键 1.单字段主键 (1)在定义列的同时指定主键&#xff0c;语法规则如下&#xff1a; (2)在定义完所有列之后指定主键。 2.多字段联合主键 外键&#xff1a; 非空约束&#xff1…

用户态内存映射

内存映射不仅仅是物理内存和虚拟内存之间的映射&#xff0c;还包括将文件中的内容映射到虚拟内存空间。这个时候&#xff0c;访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射&#xff0c;是一种特殊情况。 对于堆的申请来讲&#xff0c;mmap 是映射内…

试试流量回放,不用人工写自动化测试case了

大家好&#xff0c;我是洋子&#xff0c;接触过接口自动化测试的同学都知道&#xff0c;我们一般要基于某种自动化测试框架&#xff0c;编写自动化case&#xff0c;编写自动化case的依据来源于接口文档&#xff0c;对照接口文档里面的请求参数进行人工添加接口自动化case 其实…

应用安全四十二:SSO安全

一、什么是SSO SSO是单点登录(Single Sign On)的缩写,是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是比较流行的企业业务整合的解决方案之一。 身份验证过程依赖于双方之间的信任关…

大数据毕业设计选题推荐-智慧小区大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

2022年ISSCC会议报告分析

Tutorial Fundamentals of Self-Sensing Processor Systems AMD Zen架构的CCD die中有很多传感器检测die的频率、电压、电压和温度 HBM DRAM and 3D Stacked Memory Advances in Digital vs. Analog AI Accelerators Nvidia的Multi-chip架构的DNN加速器 Form1: Compute-in…

Pycharm-community-2021版安装和配置

一、下载Pycharm-community-2021 1.从官网下载pycharm-community Pycharm 版本官网 二、安装PyCharm 1.打开下载完成的安装包&#xff0c;点击Next 2.安装PyCharm到其他位置,点击Next 3.一定把更新PATH变量勾上,可以创建桌面快捷方式&#xff0c;创建关联&#xff0c;最后…