QML静态值与属性绑定

简述

可以为 QML 对象中的属性分配两种类型的值 - 静态值和绑定表达式,后者也称为属性绑定。

  • 静态值:一个不依赖于其他属性的常数值。
  • 绑定表达式:一个用于描述属性间依赖关系的 JavaScript 表达式。

属性绑定是 QML 的一个核心特性,允许指定不同对象属性之间的依赖关系。当属性的依赖项(属性绑定中的变量)的值发生改变时,属性将根据指定的关系自动更新。

  • 简述
  • 静态值
  • 属性绑定
    • 使用属性绑定
    • 从 JavaScript 创建属性绑定
    • 在属性绑定中使用 this

版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820

静态值

所谓静态值,就是一个不依赖于其他属性的常数值。例如:width : 100,其中 100 就是一个静态值。

下面的示例,将 Rectangle 的 width 和 height 均分配为静态值。

import QtQuick 2.3

Rectangle {
    // 初始化赋值 - 静态值
    width: 200
    height: 200

    Rectangle {
        // 初始化赋值 - 静态值
        width: 100
        height: 100
        color: "blue"
    }
}

既然蓝色 Rectangle 的 width 和 height 都是静态值,那么当父 Rectangle 大小发生变化时,蓝色 Rectangle 的大小必然不会改变。

属性绑定

属性绑定,简单的理解就是一个绑定表达式,用于描述属性之间的依赖关系。例如:width : parent.width / 2

QML 引擎作为属性绑定的幕后推手,在时刻监视属性的依赖项,当检测到任何依赖项的值发生改变后,就会自动重新计算绑定表达式,并为属性分配新的结果。

使用属性绑定

要创建一个属性绑定,需要为属性分配一个 JavaScript 表达式,该表达式将计算所需的值。最简单的情况,绑定是对另一属性的引用。

下面的示例,将蓝色 Rectangle 的 width 绑定到其 parent 的 width:

import QtQuick 2.3

Rectangle {
    width: 200
    height: 200

    Rectangle {
        width: parent.width
        height: 100
        color: "blue"
    }
}

每当父 Rectangle 的 width 发生变化,蓝色 Rectangle 的 width 就会自动更新为相同的值。

绑定可以包含任何有效的 JavaScript 表达式或语句,因为 QML 使用了一个符合标准的 JavaScript 引擎。绑定可以访问对象属性、调用方法、并使用内置的 JavaScript 对象(例如:Date、Math)。下面是上述示例的其他可能性绑定:

// 访问对象属性
width: parent.width / 2

// 使用内置的 JavaScript 对象 Math
width: Math.min(parent.width, parent.height)

// 使用三目运算符
width: parent.width > 100 ? parent.width : parent.width /2

// if-else 代码块中的 return 关键字可有可无
width: {
    if (parent.width > 100)
        return parent.width
    else
        return parent.width / 2
}

// 调用方法
height: someMethodThatReturnsWidth()

在语法上,绑定允许具有任意复杂性(例如:涉及多行或命令循环)。但是,如果绑定过于复杂,可能会降低代码性能、可读性、和可维护性。比较好的方法是:重新设计具有复杂绑定的组件,或者至少将绑定转换为单独的函数。

从 JavaScript 创建属性绑定

具有绑定的属性将根据需要自动更新,但是,如果稍后从 JavaScript 语句为该属性重新分配一个静态值,则将会移除绑定。

例如,下面的蓝色 Rectangle 最初确保其 width 总是其 parent 的 width 的 1/4。但是,当按下空格键时,parent.width / 2 将作为静态值赋值给 width。随后,即使其 parent 的 width 发生变化,其 width 也将保持不变,因为静态值的分配移除了绑定。

import QtQuick 2.3

Rectangle {
    width: 200
    height: 200

    Rectangle {
        id: rect
        width: parent.width / 4
        height: 50
        color: "blue"

        focus: true
        Keys.onSpacePressed: {
            width = parent.width / 2
        }
    }
}

如果目的是为了给蓝色 Rectangle 一个固定的 width 并停止自动更新,那么这没有任何问题。但是,如果是为了给 width 和其 parent 的 width 建立一个新的关系,那么新的绑定表达式必须被包裹在 Qt.binding() 函数中:

//...
Keys.onSpacePressed: {
    width = Qt.binding(function() { parent.width / 2 })
}
//...

现在,按下空格键后,矩形的高度将继续自动更新,始终为其 parent 的 width 的 1/2。

在属性绑定中使用 this

当从 JavaScript 创建一个属性绑定时,this 关键字可用于引用接收绑定的对象,这有助于解决属性名称产生的歧义。

例如,下面的 Component.onCompleted 处理程序在 Item 的范围内定义。此范围内,width 是指 Item 的 width,而不是 Rectangle 的 width。要将 Rectangle 的 height 绑定到其自身的 width,绑定表达式必须显式地引用 this.width(或者 rect.width):

import QtQuick 2.3

Item {
    width: 200
    height: 200

    Rectangle {
        id: rect
        width: 100
        color: "blue"
    }

    Component.onCompleted: {
        rect.height = Qt.binding(function() { return this.width * 2 })
        console.log("rect.height = " + rect.height) // 打印 200, 而非 400
    }
}

可以看出,this 指向的是接收 Qt.binding() 的返回值的对象。在这里,可以理解为 rect 表示的对象。

注意: this 的值不是在属性绑定之外定义的。

时间: 2024-10-26 18:49:46

QML静态值与属性绑定的相关文章

PHP static 静态变量和属性方法使用说明

变量与其它变量 明确区别的,下面我来给各位介绍 static 静态变量和属性方法及静态变量的引用与静态函数的用法,各位有需要了解的同学可参考. 静态变量 变量范围的另一个重要特性是静态变量(static variable).静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失.看看下面的例子: 例子 7-4. 演示需要静态变量的例子  代码如下 复制代码 <?php function Test () { $a = 0; echo $a; $a++; } ?>    本函数没什

JS编程建议——42:用好正则表达式静态值

建议42:用好正则表达式静态值正则表达式的静态属性比较特殊,有两个名字:长名(全称)和短名(简称,以美元符号开头表示),详细说明见表2.1.表2.1 RegExp的静态属性长名 短名 说明input $_ 最后用于匹配的字符串,即传递给exec()或test()方法的字符串lastMatch $& 最后匹配的字符lastParen $+ 最后匹配的分组leftContext $` 在上次匹配之前的子字符串multiline $* 用于指定是否所有表达式都使用多行模式的布尔值rightContex

WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter

一.如何从 Datagrid 中获得单元格的内容 DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemContainer 封装它的 items.  但是,WPF中的DataGrid 不同于Windows Forms中的 DataGridView. 在DataGrid的Items集合中,DataGridRow 是一个Item,但是,它里面的单元格却是被封装在 DataGridCellsPresenter 的容器中:因此,我们不能使用 像DataGrid

wcf返回值的属性是引用类型就报错

问题描述 wcf返回值的属性是引用类型就报错 套接字连接已中止.这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的.本地套接字超时是"00:09:59.9844000", wcf 方法放回类型是类,类里面有个属性是object.如果object存放值类型.返回时就没事,如果是引用类型或者datatable.就报这个错误.

博客-放在github page上的静态网站怎么取消绑定自定义域名?

问题描述 放在github page上的静态网站怎么取消绑定自定义域名? 购买域名后添加了 @ CNAME 我的用户名.github.io blog A 192.30.252.154 blog A 192.30.252.153 三条记录然后在gh-pages分支上添加了内容为**blog.我的域名.cn**的CNAME文件 但是访问的时候一直说服务器未响应,应该是github page给的ip的问题 所以现在想改回来直接用 用户名.github.io来访问 于是删掉了CNAME文件,但是访问 用

关于JS中match() 和 exec() 返回值和属性的测试_javascript技巧

语法: exec() : RegExpObject.exec(string) match() : stringObject.match(string) stringObject.match(regexp) 知识点: exec() 是RegExp对象的方法,而 match() 是String对象的方法. 都会返回包含第一个匹配项信息的数组:或者在没有匹配项的情况下返回null. 返回的数组虽然是Array 的实例,但包含两个额外的属性:index 和 input.其中,index 表示匹配项在字符

为什么给qml对象Wui的属性text赋值不成功

问题描述 为什么给qml对象Wui的属性text赋值不成功 function createWord(x1,color1,name1){ if(gameArea.component==null){ gameArea.component=Qt.createComponent("Wordui.qml"); } var Wui; if(gameArea.component.status==Component.Ready){ Wui=gameArea.component.createObject

Silverlight 5 beta新特性探索系列:7.结合上层元素属性绑定和Style Setter上的绑定

   在Silverlight 5中添加了相对上层元素属性的绑定,还有Style Setter也可以绑定数据.         一.相对上层元素属性的绑定        它是在元素内部的子孙级元素中的某一些属性可以绑定为祖先级元素的某一些属性.比如说再一个ListBox的Tag元素值为:"这是第一个父级绑定",在ListBox.Templete下面添加一个TextBlock元素的Text属性设置为 <TextBlock Text="{Binding Tag,Relati

使用注解属性绑定

大家应该知道在Spring中有一个注解@Value,他可以帮助我们来讲Spring加载的配置文件(*.perperties)文件中的信息自动的注入到我们的非静态属性中的. 一般情况下我们会这样使用: 1. 首先在Spring的配置文件中加载属性文件: 1 <context:property-placeholder location="classpath:component.properties"  ignore-unresolvable="true"/>