QML系列教程(8)-状态State+属性变化PropertyChanges+when的用法

9 篇文章 5 订阅

何时使用这个状态。

所谓状态,就是某个或某些元素的一组属性值。我们可以定义一些状态,并在满足某些条件时,自由切换这些状态。

应用实例:

前面博文《QML系列教程(4)-自定义按钮》,当鼠标按下它之后,背景色会变;当鼠标弹起后,颜色会恢复。在那个例子的代码中,鼠标按下时,我们直接修改了它的背景色,弹起时,又修改了它的背景色。试想,如果你不仅想修改背景色,还想修改它的形状、边框粗细、边框颜色、旋转角度。。等等其他属性,那这段代码会看起来非常混乱。
如果你同时想修改多个元素的多个属性,那就更乱了。

针对这一应用场景,QML提供了一个好的解决方案,那就是定义状态。

使用中括号,定义多个状态的语法格式,例如:

    states: [
        State {
                name: "stat1";
                PropertyChanges { target: ele1; 其他属性} //定义元素ele[1]的各种属性
                PropertyChanges { target: ele2; 其他属性} //定义元素ele[2]的各种属性
                //....
                //PropertyChanges { target: elen; 其他属性} //定义元素ele[n]的各种属性
            }, //注意这里有个逗号
        State {
            name: "stat2";
            PropertyChanges { target: ele1; 其他属性} //定义元素ele1的各种属性
            PropertyChanges { target: ele2; 其他属性} //定义元素ele2的各种属性
        }
        //.....
        // 状态N
        //最后一个State后面不能有逗号。C语言数组中最后带个逗号没事,但是QML不允许
    ]

以设置属性的方式,设置状态,语法形如:(可用于整个界面的默认状态)

state: "releaseStat"

以javascipt代码段的方式,设置状态,语法形如:

root.state =  "pressStat"

编程示例:

在界面中显示一个矩形按钮和一段文字,当鼠标进入矩形时,按钮和文字都发生状态变化,鼠标移出时,按钮和文字也都发生状态变化。

//本文件用来演示【状态】的用法
import QtQuick 2.0

Item {
    id: root
    width: 200
    height: width

    Rectangle{
        id: btn
        height: 50
        width: 100
        color: "green"
        MouseArea {
            id: mouseArea
            hoverEnabled: true;
            anchors.fill: parent
            onEntered: {//鼠标进入瞬间
                console.log("enter");
                root.state =  "stat_in" //切换状态
            }
            onExited: {//鼠标滑出瞬间
                console.log("exit");
                root.state =  "stat_out" //切换状态
            }
        }
    }

    Text{
        id: label
        height: 50
        width: 100
        color: "black"
        font.pixelSize: 30
        text: "初始文字"
        anchors.left: btn.right
        anchors.verticalCenter: btn.verticalCenter //文字垂直对齐到按钮
        anchors.leftMargin: 20 //左锚点距离
        verticalAlignment: Text.AlignVCenter //垂直居中
        horizontalAlignment: Text.AlignLeft //水平左对齐
    }

    states: [
        State { // 状态1
                name: "stat_in";
                PropertyChanges { target: btn; color: "blue"; border.color: "green"; border.width: 5}
                PropertyChanges { target: label; color: "red"; text: "进入"}
            },
        State {// 状态2
            name: "stat_out";
            PropertyChanges { target: btn; color: "lightgreen"; border.color: "green"; border.width: 5}
            PropertyChanges { target: label; color: "black"; text: "退出"}
        }
    ] 
}

在上述代码中,根据鼠标切换不同状态,使用了MouseArea的 onEntered槽函数和onExited槽函数,其实切换状态还有更便捷的方法,就是直接设置State的when属性,语法:

State { // 状态定义
                name: "stat_in";
                when: 条件
                PropertyChanges { target: btn; color: "blue"; ......}
                .................
       },

当when的条件为true时,会切换为该状态,当false时,恢复为原状态(或者满足其他条件的状态)

把上述代码states部分修改为:
 

    states: [
        State { // 状态1
                name: "stat_in";
                when: mouseArea.pressed //当鼠标按下时
                PropertyChanges { target: btn; color: "blue"; border.color: "green"; border.width: 5}
                PropertyChanges { target: label; color: "red"; text: "进入"}
            },
        State {// 状态2
            name: "stat_out";
            when: !mouseArea.pressed //当鼠标弹起时
            PropertyChanges { target: btn; color: "lightgreen"; border.color: "green"; border.width: 5}
            PropertyChanges { target: label; color: "black"; text: "退出"}
        }
        //.....
        // 状态N
    ]

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值