Qt 学习要点记录(2)

  • Qt.binding()的作用,动态创建新的绑定,就是向Qt.binding()传递一个函数来返回需要的结果。

import QtQuick 2.0
​
Item {
    width: 600
    height: 600
    Rectangle{
        width: 10;height: width * 2
        color: "red";anchors.centerIn: parent;focus: true
        Keys.onSpacePressed:
            /*使用Qt.binding()来绑定height和width的关系,
            * 这样只要width变化,就是触发height变化
            */
            height = Qt.binding(function(){return width*3})
​
        MouseArea{
            anchors.fill: parent
            onClicked: parent.width += 10
        }
    }
}

 

  • 在属性绑定中可以使用this,在其他情况下this的值都是未定义的。

  • connect()函数在什么时候使用?

一般的,发射信号的QML对象类型会提供一个默认的信号处理器。但是,有时需要从一个对象发射一个信号来触发另一个对象中定义的函数,这时就需要使用connect()函数。

  • 关键属性信号处理器Component.onCompleted:每一个QML对象都包含一个附加的Component属性,它可以引用对象被实例化的组件。每一个Component都会发射一个onCompleted信号,其对应的onCompleted()处理器会在QML环境完全建立以后执行。在onCompleted()中的脚本代码就可以实现在启动时运行,一些初始化的操作都可以放在这里进行。

  • 一个QML文档包含两部分:import导入语句和一个单一的根对象声明构成的对象树。需要强调的时,一个QML文档只能包含一个根对象声明,不允许出现两个平行的根对象。比如下面的代码肯定是错误的:

    import QtQuick 2.0
    ​
    Item {
        width: 600
        height: 600
    }
    ​
    Rectangle{
        function startupFunction(){
            //...startup code
        }
    ​
        Component.onCompleted:
            startupFunction();
    }
    • QML文件名必须以大写字母开头,如:Abc.qml

    • .qml文件中的根对象定义了可用于该QML类型的一些特性。所有属于该根对象的属性信号方法,无论是自定义声明,还是来自QML类型,都可以在外部进行访问,并且可以被该类型的对象进行读取和修改。例如,在SquareButton.qml中的Rectangle使用如下代码进行定义:

    //SquareButton.qml
    import QtQuick 2.0
    Rectangle{
        id: root
        property bool pressed: mouseArea.pressed
        signal buttonClicked(real xPox, real yPos)
    ​
        function randomizeColor(){
            root.color =
                    Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
        }
    ​
        width: 100;height: 100
        color: "red"
        MouseArea{
            id:mouseArea
            anchors.fill: parent
            onClicked:
                root.buttonClicked(mouse.x, mouse.y)
        }
    }

    所有的SquareButton对象都可以使用这里定义的pressed属性、buttonClicked信号和randomizeColor()方法。例如:

    //application.qml
    import QtQuick 2.0
    SquareButton{
        id:squareButton
        onButtonClicked:{
            console.log("Clicked", xPos, yPos)
        }
    }

    需要注意的时,在SquareButton.qml中定义的任何一个id值都不能在SquareButton对象中进行访问。因为id值只能在组件作用域进行访问。另外,SquareButton对象也无法通过mouseArea来引用MouseArea子对象。如果想使用MouseArea等子对象中的内容,需要像这里定义pressed属性一样,将子对象中的属性定义到根对象中。如果这里定义的SquareButton对象的id值不是squareButton,而是root,它也不会与SquareButton.qml中定义的根对象的id值发生冲突,因为它们定义在不同的作用域。

    • Component组件定义只包含一个唯一的根对象,并且不能在根对象之外定义任何数据,只能使用id进行引用。Component首字母要大写哦C,写成componet可就是另外的意思了。

    import QtQuick 2.2
    Item {
        width:100;height: 100
        Component{
            id:redSquare
            Rectangle{
                color: "red"
                width: 10
                height: 10
            }
        }
    ​
        Loader{sourceComponent: redSquare}
        Loader{sourceComponent: redSquare;x:20}
    }

     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值