QML Qt.binding

Qt.bindding的执行由QML引擎监控,一旦满足绑定条件就会响应。

第一种:为属性绑定一段代码

Rectangle{
        implicitWidth: 300;
        implicitHeight: 200;
        TextField {
              id: control1;
              implicitWidth: parent.width;
              implicitHeight: 60;
              anchors.top: parent.top;
              placeholderText: qsTr("Enter description");

              background: Rectangle {
                  implicitWidth: 300;
                  implicitHeight: 60;
                  color: control1.enabled ? "transparent" : "#353637";
                  border.color: control1.enabled ? "#21be2b" : "transparent";
              }

        }

        TextField {
              id: control2;
              implicitWidth: parent.width;
              implicitHeight: 60;
              anchors.top: control1.bottom;
              anchors.topMargin: 5;
              readOnly: true;

              background: Rectangle {
                  implicitWidth: 300;
                  implicitHeight: 60;
                  color: control2.enabled ? "transparent" : "#353637";
                  border.color: control2.enabled ? "#21be2b" : "transparent";
              }
        }
        // 界面初始化之后,把control2的text绑定到control1上,这样control1的text变化,control2的text同步变化
        Component.onCompleted: {
                       control2.text = Qt.binding(function(){return control1.text});
                       }
}

绑定之后的属性(control2.text)如果有control2.text="***"这样的赋值行为,那么Qt.binding的效果将会失效。

第二种:动态创建对象时初始化属性

新建一个DynamicText.qml文件如下:

import QtQuick 2.0

  Text {
      id: textElement
      width: 200
      height: 200
      text: "Default text"
      property string dynamicText: "Dynamic text"
      onTextChanged: console.log(text)
  }

新建一个main.qml文件如下:动态创建对象Qt.createObject()

import QtQuick 2.12
import QtQuick.Controls 2.12
Rectangle{
	implicitWidth: 100;
	implicitHeight: 80;
	Item {
		id: testObj
        property string dynamicText: "dynamicText text"

        Component.onCompleted: {
			 var c = Qt.createComponent("DynamicText.qml"); 
			 // obj1.text 与 testObj.dynamicText+' extra text'绑定,
			 var obj1 = c.createObject(testObj, { 'text': Qt.binding(function() { return dynamicText + ' extra text' }) })
			 testObj.dynamicText = "Modified testObj dynamicText"
		  
			 // this.dynamicText使用DynamicText.qml里面的dynamicText属性
			 // obj2.text与obj2.dynamicText绑定
			 var obj2 = c.createObject(testObj, { 'text': Qt.binding(function() { return this.dynamicText + ' extra text' }) })
			 obj2.dynamicText = "Modified dynamic text" // 会影响到obj2.text
		}
    }
}

另一种动态创建的main.qml: 

import QtQuick 2.12
import QtQuick.Controls 2.12
Rectangle{
	implicitWidth: 100;
	implicitHeight: 80;
	
  Item {
      id: root
      property string dynamicText: "Root text"

      Loader {
          id: loaderOne
          onLoaded: root.dynamicText = "Modified root text"
      }

      Loader {
          id: loaderTwo
          onLoaded: item.dynamicText = "Modified dynamic text"; // item代表DynamicText.qml的根节点
      }

      Component.onCompleted: {
          loaderOne.setSource("DynamicText.qml", { 'text': Qt.binding(function() { return dynamicText + ' extra text' }) })
          loaderTwo.setSource("DynamicText.qml", { 'text': Qt.binding(function() { return this.dynamicText + ' extra text' }) })
      }
  }
}
  1. Qt.binding()中可以访问对象的属性
  2. Qt.binding()中可以访问对象的方法
  3. 可以使用QML内置的JavaScript的对象

常见的绑定形式:

Rectangle{
    implicitWidth: 100;
    implicitHeight: 100;
    Rectangle{
        anchors.top=parent.top; // 这种也是绑定,Qt.binding()不能应用在这种形式当中
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值