QML学习笔记(六十四)动画相关:State状态、Transition过渡和Gradient渐变

前言

今天学习到一个有关状态的概念,叫State。有趣的事,这个东西在QWidget那套样式表的格式中也有应用,比方说某个控件存在不同的切换状态,我们就可以使用State的方式来写样式表,然后C++代码中进行状态切换。有点扯远了,接下来就记录一下QML中有关State的使用,顺便应用一下Transition过渡

一、State状态

没什么好说的,直接看代码。

完整代码:

cpp 复制代码
import QtQuick 2.15
import QtQuick.Window 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("StateAndTransition")

    Rectangle{
        id: containerRectId
        anchors.fill: parent

        //Sky
        Rectangle{
            id:skyId
            width: parent.width
            height:200
            color: "blue"
        }

        Rectangle{
            id: groundId
            anchors.top: skyId.bottom
            anchors.bottom: parent.bottom
            width: parent.width
            color:"lime"
        }

        Rectangle{
            id: sunId
            x: parent.width - width - 100
            y:50
            width: 100
            height: 100
            color: "yellow"
            radius: 600
        }

        state: "spring"

        states: [
            //Spring
            State{

                name: "spring"
                PropertyChanges {
                    target: skyId
                    color: "deepskyblue"
                }
                PropertyChanges {
                    target: groundId
                    color: "lime"
                }
                PropertyChanges {
                    target: sunId
                    color:"lightyellow"
                }
            },

            //Summer
            State{

                name:"summer"
                PropertyChanges {
                    target: skyId
                    color:"lightblue"
                }
                PropertyChanges {
                    target:groundId
                    color:"darkkhaki"
                }
                PropertyChanges {
                    target: sunId
                    color:"yellow"
                }
            }
        ]

        transitions: [
            Transition {
                from: "summer"
                to: "spring"

                ColorAnimation {
                    duration: 500
                }
                NumberAnimation{
                    property: "opacity"
                    duration: 500
                }
            },
            Transition {
                from: "spring"
                to: "summer"

                ColorAnimation {
                    duration: 500
                }
                NumberAnimation{
                    property: "opacity"
                    duration: 500
                }
            }
        ]

        MouseArea{
            anchors.fill: parent
            onClicked:function(){
                containerRectId.state = (containerRectId.state === "spring" ? "summer" : "spring")
            }
        }
    }
}

states是一个状态数组,里面添加了两种状态,分别是spring春天和summer夏天。里面会包含几个PropertyChanges 属性变更,然后指定target对象和属性,这里是color颜色。

最后,我们通过MouseArea的点击,还有三元运算符来进行状态的切换。

代码其实比较好理解,说完下面的过渡,再贴上效果图。

二、Transition过渡

以下是过渡效果的代码:

cpp 复制代码
transitions: [
            Transition {
                from: "summer"
                to: "spring"

                ColorAnimation {
                    duration: 500
                }
                NumberAnimation{
                    property: "opacity"
                    duration: 500
                }
            },
            Transition {
                from: "spring"
                to: "summer"

                ColorAnimation {
                    duration: 500
                }
                NumberAnimation{
                    property: "opacity"
                    duration: 500
                }
            }

它也是数组和单个过渡元素的设置,from和to则不是实际的组件元素,而是状态名称,这一点还是有点不同的。这里终于添加了有关动画的效果,分别是颜色动画和数值动画。最后看一下效果,我觉得还挺舒服的。

在我跟学的视频中,还有树木图片的状态切换。但我没有图片资源,我也懒得搞了。

三、带渐变的状态

使用这种方式,可以设置颜色渐变:

cpp 复制代码
            gradient: Gradient{
                GradientStop{
                    id: groundStartColorId
                    position: 0.0
                    color: "lime"
                }
                GradientStop{
                    id: groundEndColorId
                    position: 1.0
                    color: "lightyellow"
                }
            }

0.0到1.0,意味着y轴上从0到1范围,也就是全部范围的颜色渐变。也可以在中间多插入几个渐变点进行控制。

下面是完整代码:

cpp 复制代码
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Shapes 1.10

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("StateAndTransition")

    Rectangle{
        id: containerRectId
        anchors.fill: parent

        //Sky
        Rectangle{
            id:skyId
            width: parent.width
            height:200
            // color: "blue"
            gradient: Gradient{
                GradientStop{
                    id: skyStartColorId
                    position: 0.0
                    color: "blue"
                }
                GradientStop{
                    id: skyEndColorId
                    position: 1.0
                    color: "#66CCFF"
                }
            }
        }

        Rectangle{
            id: groundId
            anchors.top: skyId.bottom
            anchors.bottom: parent.bottom
            width: parent.width
            // color:"lime"
            gradient: Gradient{
                GradientStop{
                    id: groundStartColorId
                    position: 0.0
                    color: "lime"
                }
                GradientStop{
                    id: groundEndColorId
                    position: 1.0
                    color: "lightyellow"
                }
            }
        }

        Rectangle{
            id: sunId
            x: parent.width - width - 100
            y:50
            width: 100
            height: 100
            color: "yellow"
            radius: 600
        }

        state: "spring"

        states: [
            //Spring
            State{

                name: "spring"
                // PropertyChanges {
                //     target: skyId
                //     color: "deepskyblue"
                // }
                PropertyChanges {
                    target: skyStartColorId
                    color: "deepskyblue"
                }
                PropertyChanges {
                    target: skyEndColorId
                    color: "#AACCFF"
                }
                // PropertyChanges {
                //     target: groundId
                //     color: "lime"
                // }
                PropertyChanges {
                    target: groundStartColorId
                    color: "lime"
                }
                PropertyChanges {
                    target: groundEndColorId
                    color: "#66CCFF"
                }
                PropertyChanges {
                    target: sunId
                    color:"lightyellow"
                }
            },

            //Summer
            State{

                name:"summer"
                // PropertyChanges {
                //     target: skyId
                //     color:"lightblue"
                // }
                PropertyChanges {
                    target: skyStartColorId
                    color: "lightblue"
                }
                PropertyChanges {
                    target: skyEndColorId
                    color: "#EECCFF"
                }
                // PropertyChanges {
                //     target:groundId
                //     color:"darkkhaki"
                // }
                PropertyChanges {
                    target: groundStartColorId
                    color: "lime"
                }
                PropertyChanges {
                    target: groundEndColorId
                    color: "yellow"
                }
                PropertyChanges {
                    target: sunId
                    color:"yellow"
                }
            }
        ]

        transitions: [
            Transition {
            from: "*"
            to: "*"

            ColorAnimation {
                duration: 500
            }
            NumberAnimation{
                property: "opacity"
                duration: 500
            }
        }
        ]

        MouseArea{
            anchors.fill: parent
            onClicked:function(){
                containerRectId.state = (containerRectId.state === "spring" ? "summer" : "spring")
            }
        }
    }
}

运行效果:

四、总结

State状态、Transition过渡和Gradient渐变,无疑更加丰富了QML中的动态效果。其实状态和渐变作为基础ui效果,在qwidget中也有应用,但配合上过渡的动画效果,给人的体验感还是挺不一样的。希望后续实际开发中也有机会使用到这个东西。

相关推荐
嵌入式小企鹅2 分钟前
UiPath推出AI编程“总指挥台”,SiFive发布RISC-V第三代猛兽
人工智能·学习·google·程序员·ai编程·risc-v·开源工具
计算机安禾14 分钟前
【c++面向对象编程】第24篇:类型转换运算符:自定义隐式转换与explicit
java·c++·算法
Ada大侦探17 分钟前
新手小白学习数据分析03----Excel 报表之大厂周报(2026最新版实操,包教包会!)
学习·数据分析·excel
雪度娃娃18 分钟前
转向现代C++——优先选用nullptr而不是0和NULL
开发语言·c++
我星期八休息26 分钟前
Linux系统编程—基础IO
linux·运维·服务器·c语言·c++·人工智能·算法
萌新小码农‍1 小时前
python装饰器
开发语言·前端·python
KK溜了溜了1 小时前
Python从入门到精通
服务器·开发语言·python
故事和你911 小时前
洛谷-【图论2-1】树5
开发语言·数据结构·c++·算法·动态规划·图论
threelab1 小时前
Three.js 初中数学函数可视化 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器
-To be number.wan1 小时前
进程与线程的区别
学习·操作系统