QML属性详解

简介

QML的元素使用它们的元素类型名来进行声明,使用它们的属性或者创建自定义属性来定义。一个属性对应一个值(代码格式为:  属性名:属性值),例如:
width:100;
text:'Hello QtQuick';
color: "#f0f0f0";
一个属性有一个类型定义并且需要一个初始值。

代码实例

以Text QML Type为例来学习一下QML的属性知识点:
    Text {
        //1.标识符
        id: textId;

        //2.设置x和y的坐标(位置)
        x:root.width/2-width/2; y:root.height/2;

        //3.绑定宽度为3倍的高度
        width: 3*height;


        //*4.自定义属性
        property int times: 24;

        //5.属性(times)别名
        property alias timesAlias: textId.times;

        //6.设置文本的追加
        text: "Hello QtQuick" + times;

        //7.font 是一个属性组
        font.family: "UBuntu";
        font.pixelSize: 24;

        //8.KeyNavigation 是一个附加属性
        KeyNavigation.tab: view;

        //9.处理(高度)属性改变的信号
        onHeightChanged: console.log("height:", height);

        //10.接收到键盘事件是需要获得焦点
        focus: true;

        //11.根据是否获得焦点值来改变颜色
        color: focus ? "red" : "white";

        //12.水平对齐方式和垂直对齐方式
        horizontalAlignment: Text.AlignHCenter;
        verticalAlignment: Text.AlignVCenter;
    }

详细解析


1.id是一个非常特殊的属性值,它在一个QML文件中被用来引用元素。id不是一个字符串,而是一个标识符(如同C/C++的变量名一样)和QML语法的一部分。一个id在一个QML文档中是唯一的,并且不能被设置为其它值;
2.一个属性能够设置一个值,这个值依赖于它的类型。如果没有对一个属性赋值,那么它就会被初始化为一个默认值(如同C++世界中系统提供的默认构造函数一样)。你可以查看特定的元素文档来获得这些初始值的信息;
3.一个属性能够依赖于一个或者多个其它的属性,这种操作称做属性绑定。当它依赖的属性改变时,它的值也会更新。这就像订了一个协议,在这个例子中width始终是height的3倍。
4.添加自己定义的属性需要使用property修饰符,然后跟上类型,名字和可选择的初始值。如果没有初始值将会给定一个系统初始值作为初始值。注意如果属性名与已定义的默认属性名不重复,使用default关键字你可以将一个属性定义为默认属性。这在你添加子元素时用得着,如果它们是可视化元素,子元素会自动地添加默认属性的子类型链表(children property list)。
5.另一个重要的声明属性的方法是使用alias关键字(property alias name:已有属性)。alias关键字允许我们转发一个属性或者转发一个属性对象自身到另一个作用域。我们将在后面定义组件导出内部属性或者引用根级元素id会使用到这个技术。一个属性别名不需要类型,它使用引用的属性类型或者对象类型。
6.text属性依赖于自定义的timers(int整型数据类型)属性。int整型数据会自动转换为string字符串类型数据。这样的表达方式本身也是另一种属性绑定的例子,文本结果会在times属性每次改变是刷新。
7.一些属性是按组分配的属性。当一个属性需要结构化并且相关的属性需要联系在一起时,我们可以这样使用它。另一个组属性的编码方式是font {family:“UBuntu”;pixelSize:24}.
8.一些属性是元素自身的附加属性。这样做是为了全局的相关元素在应用程序中只出现一次(例如键盘输入)。
9.对于每个元素你都可以提供一个信号操作。这个操作在属性值改变时被调用。例如这里我们完成了当height(高度)改变时会使用控制台输出一个信息。
。。。
小贴士:
一个元素的id应该只在当前文档中被引用。QML提供了动态作用域的机制,后加载的文档会覆盖之前加载文档的id,这样就可以引用已加载并且没有被覆盖的元素id,这有点类似创建全局变量。但不幸的是这样的代码可读性很差。目前这个还没有办法解决这个问题,所以你使用这个机制的时候最好仔细一些甚至不要使用这种机制。如果你想向文档外提供元素的调用,你可以在根元素上使用属性导出的方式来提供。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值