Qt quick基础3(基础动画,包含旋转动画、串行并行动画及其嵌套)

news2025/1/8 4:26:26

Qt quick基础3(基础动画)

目录

  • Qt quick基础3(基础动画)
    • 前言
    • 前期准备工作
    • Animation on property 元素加载后自动运行动画
    • Behavior on property 当元素值改变后运行动画
    • Standalone Animation 单独动画
    • 旋转动画
    • 分组动画
      • 串行动画
      • 并行动画
      • 串行并行嵌套
    • 小结

前言

上一个教程我们已经讲述了基本元素Text Image Rectangle的使用,并且其中也涉及了Mousearea鼠标区域,以及旋转平移放缩等基础元素的使用,本节我们介绍简单的动画。

我们可以先来打开Qt assistant来看看Qt中如何介绍这个元素

animation

Animation元素主要有以下的使用方法:

  • PropertyAnimation 元素值改变时的动画
  • NumberAnimation qreal类型值的变化时的动画
  • ColorAnimation 颜色值的变化时的动画
  • RotationAnimation 旋转值变化时的动画
  • Animation on property 元素加载后自动运行的动画
  • Behavior on property 当元素值改变后运行动画
  • Standalone Animation 单独动画,使用start()运行

前期准备工作

为了体现动画效果,修改之前的可点击图片,使其具有可以添加文本的功能

//ClickableImageV2.qml
import QtQuick 2.15

Item {
    id: imagechange
    width: container.childrenRect.width
    height: container.childrenRect.height
    property alias text: label.text
    property alias source: image.source
   // property alias imagechange_height: imagechange.height
   // property alias imagechange_width: imagechange.width

    signal clicked

    Column{
        id:container
        Image{
            id:image
        }
        Text {
            id: label
            width: image.width
            horizontalAlignment: Text.AlignHCenter //水平对齐方式:居中对齐
            wrapMode: Text.WordWrap //自动换行
            color: "#0000FF"

        }

    }
    MouseArea{
        anchors.fill: parent
        onClicked: imagechange.clicked()
    }

}



再将该qml添加到cmake中去,并在“main.qml”文件中引入import Components,类似于上一篇文章一样,这样在main文件中就可以调用ClickableImageV2元素了。

Animation on property 元素加载后自动运行动画

 ClickableImageV2{
        id: cat
        x:100;y:180
        source:"https://ts1.cn.mm.bing.net/th/id/R-C.c1ef7c28ec0c3a03671bf8c5b84824a9?rik=gtgH8z39ogolSA&riu=http%3a%2f%2fimg.touxiangwu.com%2fuploads%2fallimg%2f230101%2f1_010120010R534.jpg&ehk=%2bP%2fA9Bc1Xw28uBxAFWEP0qGpscER%2bd8hq%2flkynX4qUw%3d&risl=&pid=ImgRaw&r=0" //网上随便找的图片
        text: "animation on property"
        NumberAnimation on y{
            to:40;duration:500 //沿y轴移动到40,持续时间500ms
        }
    }

效果最后再一起通过动图展示

Behavior on property 当元素值改变后运行动画

 ClickableImageV2{
        id: beauty
        x:300;y:180
        source:"https://ts1.cn.mm.bing.net/th/id/R-C.6ea41fdad2fdbe324a84b6b68969ae4d?rik=nsNtS0in5lEFjw&riu=http%3a%2f%2fimg.touxiangwu.com%2fuploads%2fallimg%2f221229%2f1_12291Q03140R.jpg&ehk=Irzz7kT29gRfpRgrn7Z7KipUPsJuV6HR0yZGdyFD41M%3d&risl=&pid=ImgRaw&r=0"
        text: "behavior on property"

        Behavior on y{
            NumberAnimation{duration: 1000}
        }
        onClicked: y=40 //当点击时移动到y=40,持续时间1000ms
    }

效果最后再一起通过动图展示

Standalone Animation 单独动画

ClickableImageV2{
        id: girl
        x: 500; y:180
        source: "https://ts1.cn.mm.bing.net/th/id/R-C.12367521e2e0f47880028f006af212bf?rik=NLFH66WqxDZm6g&riu=http%3A%2F%2Fimg.touxiangwu.com%2Fuploads%2Fallimg%2F221201%2F1_1201092K92159.jpg&ehk=%2FljyxcnFggMfIvNo2bBTZgZwIRBphREqz8iEsamoh%2Bc%3D&risl=&pid=ImgRaw&r=0"
        onClicked: anim.start() //当按下时,动画启动
        text: "standalone animation" //图片下方文本
        NumberAnimation{
            id:anim
            target: girl
            properties: "y"
            to:40
            duration: 1000 //y移动到40,持续时间1000ms
        }
    }

动图展示:

动画1)

从上面动图中可以看到,第一张图是自动加载运行的,第二三张图是通过点击后才进行动画的,但第二三张图其实原理有所差别,上面已经说过。

旋转动画

ClickableImageV2{
        id: cat1
        x:100;y:400
        source:"https://ts1.cn.mm.bing.net/th/id/R-C.c1ef7c28ec0c3a03671bf8c5b84824a9?rik=gtgH8z39ogolSA&riu=http%3a%2f%2fimg.touxiangwu.com%2fuploads%2fallimg%2f230101%2f1_010120010R534.jpg&ehk=%2bP%2fA9Bc1Xw28uBxAFWEP0qGpscER%2bd8hq%2flkynX4qUw%3d&risl=&pid=ImgRaw&r=0"
        text: "animation on property Rotation"
        onClicked: anim1.start()

        RotationAnimation{ //旋转动画
            id:anim1
            target: cat1
            duration: 1000
            from: 0
            to: 360

        }
    }

当按下cat1这一个图片时,动画会顺时针旋转360°。此外还可以设置旋转方向,旋转次数等。

旋转动画)

分组动画

分组动画可以使得动画变得稍稍复杂一些,首先我们可以使用串行或并行动画来实现更加复杂的动画。

“SequentialAnimation ” 串行动画,先执行一个动画,而后执行另一个动画,是串行的。

“ParallelAnimation” 并行动画,一起执行动画,并行。

通过两个简单的例子来实现他们。

串行动画

 ClickableImageV2{
        id:ufo1
        x:300;y:400
        text: "ufo1"
        source: "https://ts1.cn.mm.bing.net/th/id/R-C.0c5c6d17f438b2b6a7da0cf141142a9b?rik=qQt69%2bdLe49Xhw&riu=http%3a%2f%2fairplaneclipart.com%2fpics%2fufo_1.gif&ehk=IDlJeYj9dFd%2be7O7hbrgqpstvFU%2bw9l%2b2cBVZG0v3rg%3d&risl=&pid=ImgRaw&r=0" //网上随便找的图片
        onClicked: anim3.restart()
    }

    SequentialAnimation{ //串行动画,依次执行
        id:anim3
        NumberAnimation{
            target: ufo1
            properties: "y"
            to: 20
            duration: 500

        }

        NumberAnimation {
            target: ufo1
            property: "x"
            to:160
            duration: 500

        }
    }

串行动画效果和并行的动画效果一起展示。

并行动画

ClickableImageV2{
        id:ufo
        x:300;y:400
        text: "ufo"
        source: "https://ts1.cn.mm.bing.net/th/id/R-C.8e16054c47bb2c13bc5d18e36be59932?rik=2dsQzqI5vdDqVA&riu=http%3a%2f%2fwww.jbhua.com%2fuploads%2f170415%2f1-1F415195P3X5.jpg&ehk=lTK8qdpuevC5DoxuSOI9m0Q%2biXbR4lgfH82DlxudMpo%3d&risl=&pid=ImgRaw&r=0"
        onClicked: anim2.restart()
    }
    ParallelAnimation{ //并行动画,一起执行
        id:anim2
        NumberAnimation{
            target: ufo
            properties: "y"
            to: 20
            duration: 500

        }

        NumberAnimation {
            target: ufo
            property: "x"
            to:160
            duration: 500

        }
    }

代码描述了两个在同一起点的UFO图片,通过不同的动画效果来达到相同的终点位置,动画效果如下,还是基于之前写的可以点击的图片控件,ClickableImage.qml

)

串行并行嵌套

串行动画和并行动画都是可以嵌套的。下面我们再通过一个篮球弹跳的例子说明串行动画和并行动画的嵌套。

为了更加清晰明了,新建一个工程。

Rectangle{
        id:sky
        width: parent.width
        height: 300
        gradient: Gradient{ //渐变色
            GradientStop{position: 0.0;color:"#0080FF"}
            GradientStop{position:1.0; color:"#66CCFF"}
        }
    }
    Rectangle{
        id:ground
        anchors.top:sky.bottom

        width: parent.width
        height: 180
        gradient: Gradient{ //渐变色
            GradientStop{position: 0.0;color:"#00FF00"}
            GradientStop{position:1.0; color:"#00803F"}
        }
    }

两个渐变色的矩形框,组成了蓝天和草地的图形。

Image{
        id:basketball
        x:0;y:240
        source: "https://ppt.chnlib.com/FileUpload/2019-02/100Ge_Tou_Ming_Bei_J-151627_210.png"
        MouseArea{
            anchors.fill: parent
            onClicked: {
                basketball.x=0
                basketball.y=240
                basketball.rotation=0
                anim.restart()
            }
        }
    }

Image元素引入篮球这个图片,同时点按篮球图片会恢复到原位置。

 SequentialAnimation{
        id:anim
        NumberAnimation{
            target: basketball
            properties: "y"
            to: 20
            duration: 600

        }

        NumberAnimation {
            target: basketball
            property: "y"
            to:240
            duration: 900

        }
    }
    //串行动画,实现在y轴上的篮球弹跳

动画效果如下图所示

篮球在y轴弹跳)

接下来再加上x轴的移动以及球的旋转,其中串行动画嵌套在并行动画之中。


    ParallelAnimation{ //并行动画
        id:anim
        SequentialAnimation{ //串行动画

            NumberAnimation{
                target: basketball
                properties: "y"
                to: 20
                duration: 600

            }

            NumberAnimation {
                target: basketball
                property: "y"
                to:240
                duration: 900

            }
        }

        NumberAnimation{
            target: basketball
            properties: "x"
            to: 400
            duration: 1800

        }
        RotationAnimation{
            target: basketball
            properties: "rotation"
            to:720
            //loops:Animation.Infinite
            duration: 1800
        }

    }

其中y轴上的动画是串行的,但他同时与x轴上和旋转的动画是并行的,注意动画的持续时间要匹配。

以下为最终动画效果:

篮球动画

小结

本文从基础动画出发,分别写了动画启动的不同方法,同时举了几个例子说明了旋转动画、串行动画、并行动画及其嵌套的例子,帮助学习基本的动画。

如果您觉得我写的不错,麻烦给我一个免费的赞!如果内容中有错误,也欢迎向我反馈。

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

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

相关文章

干货 | 科研决策怎么做?四个步骤一招解决!

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 又是给大家带来满满干货的一天,今天要给大家介绍的是狐少侠对于科学决策的四个步骤的详细解读! 最近,有读者问了我几个关于决策的问题:要不要…

ubuntu22.04 编译安装 Kate 编辑器

ubuntu22.04 编译安装 Kate 编辑器 文章目录 ubuntu22.04 编译安装 Kate 编辑器0x0 目的0x1 在 Ubuntu 22.04 编译安装 Kate0x11 Download dependencies0x12 Build kate and kwrite0x13 Setup paths for binary and shared libraries0x14 Misc trials 0x2 配置 Kate渲染空白字符…

R语言 | 数据分析与处理

目录 一、随机抽样 1.1 将随机抽样应用于扑克牌 1.2 种子值 ​1.3 模拟骰子 1.4 比重的设置 二、再谈向量数据的抽取——以islands为实例 三、数据框数据的抽取——重复值的处理 ​3.1 重复值的搜索 3.2 which()函数 3.3 抽取数据是去除重复值 四、数据框数据的抽取…

Linux命令·scp

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时&#xff0c…

【深度学习】第一门课 神经网络和深度学习 Week 2 神经网络基础

2.1 二元分类 前言 第二周的主题是学习神经网络的基础知识。 实现神经网络需要用到一些重要的技术和技巧,比如怎样处理包含大量样本的训练集。 在神经网络的计算中,还会有前向暂停、前向传播、反向暂停和反向传播等步骤,本周会对它们进行…

面试一个6年经验测试员:一年经验硬生生用了六年....

在众多面试中,对于那个工作了6年的面试者,我印象很深刻,因为最开始拿到简历的时候,我一摸:"这简历,好厚啊!"再一看,工作6年。 于是我去找了我的领导,我说:“这人我应该没…

C++入门基础知识总结(超详细)

目录 C入门基础知识之什么是C? C入门基础知识看看C的历史版本: C入门基础知识关键字 C入门基础之C的命名空间 C入门基础命名空间的使用 C入门基础知识的输入和输出 C入门基础知识-缺省参数 C入门基础-C函数重载 extern “C” C入门基础知识-引用 C入门基…

图像处理:图像增广算法

目录 前言 图像增广算法 a.图像旋转 b.图像亮度调整 c.图像裁剪及拼接 实验分析 本章小结 前言 图像增广算法在计算机视觉领域扮演着至关重要的角色。随着深度学习的兴起,大规模数据集的需求变得更加迫切,而图像增广算法可以通过对原始图像进行一…

手把手教你安装PaddleDetection(最新CUDA11.7版本)

前言 本文记录一下在linux系安装PaddleDetection的过程,使用Conda的方式来安装; (尝试过docker的方式,无法获取镜像;尝试过pip的方式,提升找不到库;最终使用Conda成功安装了。) 目…

什么是中国版软件能力成熟度之CSMM

当前,中国软件产业蓬勃发展,产业增速迅猛,发展韧性和潜力进一步凸显。由于我国长期缺乏相关的自主标准,20多年来国外标准在我国软件评估领域占据主导地位,不仅阻碍了我国自主产业发展,甚至通过评估等手段可…

【STM32CubeMX项目】小时钟V1.0

前言 基于STM32CubeMxSTM32F103C6T6编写时钟功能。现在以及能实现时钟的简单功能,做文记录下。还有很多可以改进的地方,也算留下的基础版本下来备份吧。我愿称之为V1.0版本。可供学习参考。 实物 引脚接线: OLED STM32F103 SCL --> PB8 SD…

使用JS手动实现SementicUI的分页,解决页数过多的问题.

自己使用SemanticUI官网的分页组件, 但是有很多细节问题并没有解决方案,如果只是需要而分页,将页数渲染在分页组件上的话,那倒很简单,但是页面有很多的话,假如100页,那么整个tbody会随着tfoot…

C# PDF附件生成

最近项目上需要生成行业某证件,查阅了一下,大体有两个思路可以实现 1.图片格式 2.PDF格式 使用图片格式,GDI绘图的形式,GDI绘图相关库资料比较多,难度也还好,问题是生成的证不是很好看,看上去…

ESP32学习笔记 -- ESP32-S3使用自定义分区表

什么是分区表? 分区表(Partition Table),主要是用来对ESP32-S3外挂的SPI FLASH进行区域划分的一个表格,通过这个表格,可以根据多个不同的功能,将SPI FLASH划分为不同的区域,方便开发者存储数据。 分区表主要有两种格式,一种是方便开发人员进行更改的.csv格式,一种是…

【Spring框架全系列】初识Spring MVC(上)

🌃哈喽,大家好,我是小浪。接着上篇博客,我们学习了springboot配置日志文件,到此,那么springboot的内容也更新的差不多了,由于是初学阶段,所以不学习那么深入,那么我们学习…

数据结构:单链表增、删、查、改的实现

1.概念 链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表 中的 指针链接 次序实现的 。 2.形式 我们使用链表一般都是创建一个结构体。 typedef int SLTDataType; typedef struct SListNode {SLTDataType data;struct SListN…

USB2.0 HUB的MTT与STT

HUB:集线器 以前呀,我也不清楚MTT与STT的区别,记得有一次选型的时候,很懵逼,结果还是按照以前同事的方案去选了,到后面想起来才抽空整明白了。 所以今天就来说下USB HUB里面的MTT与STT,并在文…

【GO】31. websocket实现

一. 引入gin、gorilla websocket包 go get github.com/gin-gonic/gin go get github.com/gorilla/websocket 二. 服务端代码 package mainimport ("bytes""fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""log&…

从字节出来的测试总监,让我们用这份《测试用例规范》,再也没加班过。

经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对编写测试用例感到困扰?例如: 固然,编写一份好的测试用例需要:充分的需求分析能力 理论及经验加持,作为测试职场摸爬打滚的老人&…

RobotStudio教程:ABB机器人TCP路径轨迹跟踪功能介绍与使用方法

目录 功能介绍 机器人工作站创建 TCP路径轨迹全局跟踪 基于事件管理器的TCP路径轨迹局部跟踪 基于Smart组件的TCP路径轨迹局部跟踪 仿真运行 功能介绍 干涉检查是虚拟仿真工作中非常重要的一个步骤,尤其是机器人工具与工件、工装夹具之间的碰撞干涉&#xff…