【QT】QML几种属性

每一个QML对象都定义了一系列属性,类似于C++中的成员变量,属性名的首字母一般小写,若属性名以多个单词表示,那么第二个及以后的单词,首字母大写。


id属性——

QML对象的id属性是唯一的,不同对象的id属性值不能相同,我们可通过某个对象的id属性来访问这个对象。id属性是QML语言内建的一个属性,在对象实例化完成后其值是不能被修改的,不同于其它的普通属性。id属性值必须以小写字母或下划线开头,且不能包含字母、数字、下划线以外的其它字符,如下所示:

Rectangle {
    id: root
    width: 800; height: 480
    color: "lightblue"

    Column {
        Text { id: myText; text: "Hello World" }
        Text { text: myText.text }
    }
}


自定义属性——

QML文件中我们可自定义属性,语法如下:

[default] property <propertyType> <propertyName> [ : <value> ]

自定义属性完成后会自动为这个属性创建一个属性值改变的信号和相应的信号处理器on<PropertyName>Changed,这里的ProperName是这个属性的名字,首字母大写,如下所示:

Rectangle {
    id: root

    property string someText
    onSomeTextChanged: console.log("The someText will be: " + someText)

    width: 800; height: 480
    color: "lightblue"

    MouseArea {
        anchors.fill: parent
        onClicked: someText = "click"
    }
}

properName以一个小写字母开头,只能包括字母、数字和下划线。propertyType可以是QML基本类型,enumerationint来代替,也可以是QML对象类型,神奇的var类型是返型的,支持任何类型的属性值,如下所示:

Item {
    property int theNumber
    property string theString
    property url theUrl

    property Item someItem
    property Rectangle someRectangle

    property var someNumber: 1.5
    property var someString: "abc"
    property var someBool: true
    property var someList: [1, 2, "three", "four"]
    property var someObject: Rectangle { width: 100; height: 100; color: "red" }
}

属性值可以被初始化,也可以使用JavaScript表达式来赋值,通过这两种方式赋值时,可以是一个静态值,也可以是一个与其它属性绑定的值。

Rectangle {
    id: rootRect

    property color theColor: "green"
    property color previousColor: rootRect.color
    property color nextColor

    width: 100; height: 100
    color: "red"

    Component.onCompleted: {
        rootRect.nextColor = rootRect.color
        console.log(theColor, previousColor, nextColor, rootRect.color)
    }
}

属性是类型安全的,赋值时属性值必须与属性类型匹配,否则会出错,如下所示:

// Invalid property assignment: int expected
property int theNumber: "one" 


列表属性——

先看如下代码:

Item {
    children: [
        Text { text: "textOne" },
        Text { text: "textTwo" },
        Text { text: "textThree" }
    ]

    Component.onCompleted: {
        for(var i = 0; i < children.length; i++)
            console.log("text of lable", i, ":", children[i].text)
    }
}

上面例子中的children属性就是一个列表属性,包含在一对方括号中,里面的元素必须是QML对象类型而不能是QML基本类型,并以逗号分隔。列表内的元素可通过数组下标[index]访问,元素个数由length属性提供。若列表内只有一个元素,方括号可省略。

自定义列表属性,代码如下:

Item {
    property list<Rectangle> siblingRects
    property list<Rectangle> childRects: [
        Rectangle { color: "red" },
        Rectangle { color: "green" },
        Rectangle { color: "blue"}
    ]

    Component.onCompleted: {
        for(var i = 0; i < childRects.length; i++)
            console.log("color of lable", i, ":", childRects[i].color)
    }
}


分组属性——

在某些情况下,属性可以是由若干个子属性构成的一个逻辑组,我们可以用“.”符号或者分组符号对其进行赋值。

Text {
    //dot notation
    font.pixelSize: 12
    font.bold: true
}

Text {
    //group notation
    font { pixelSize: 12; bold: true }
}


属性别名——

属性别名引用其它的属性,语法如下:

[default] property alias <name>: <alias reference>

name是我们自定以的属性名,aliasreference是属性别名所引用的那个属性或对象,也就是说属性别名可以引用自一个单一的属性,也可以引用自一个复杂的对象。属性绑定是动态的,但不是双向的,而通过属性别名可达到动态、双向的效果,即修改namealiasreference中任一个的值,与之关联的另一个属性值也会随之改变。还有一点需要注意的是,如果属性别名与已有的属性名相同,就会把已有的属性覆盖掉,当我们再使用这个属性的时候,实际上使用的是我们自定义的那个属性,如下所示:

Rectangle {
    id: rootRect

    property alias color: blueRect.color
    property alias theRect: blueRect

    color: "red"

    Rectangle {
        id: blueRect
        color: "#1234ff"
    }

    Component.onCompleted: {
        console.log ("color:", color, // "#1234ff"
                     "blueRect.color:", blueRect.color, // "#1234ff"
                     "theRect.color:", theRect.color, // "#1234ff"
                     "rootRect.color:", rootRect.color) // "#1234ff"

        color = "#884646"
        console.log ("color:", color, // "#884646"
                     "blueRect.color:", blueRect.color, // "#884646"
                     "theRect.color:", theRect.color, // "#884646"
                     "rootRect.color:", rootRect.color) // "#884646"

        blueRect.color = "#123456"
        console.log ("color:", color, // "#123456"
                     "blueRect.color:", blueRect.color, // "#123456"
                     "theRect.color:", theRect.color, // "#123456"
                     "rootRect.color:", rootRect.color) // "#123456"

        theRect.color = "#ff00ff"
        console.log ("color:", color, // "#ff00ff"
                     "blueRect.color:", blueRect.color, // "#ff00ff"
                     "theRect.color:", theRect.color, // "#ff00ff"
                     "rootRect.color:", rootRect.color) // "#ff00ff"
    }
}


默认属性——

任何基于Item的类型都有一个data列表属性,这个属性就是该类型的默认属性,保存了所有的孩子对象,其中可视的孩子对象又保存在了children列表属性中,不可视的孩子对象保存在了resources列表属性中,在添加子对象时childrenresources属性可写可不写,都会自动添加到对应的属性列表中,所以在之前介绍列表属性的例子中可省略children关键字,修改后如下:

Item {
    Text { text: "textOne" }
    Text { text: "textTwo" } 
    Text { text: "textThree" } 
    Component.onCompleted: {
        for(var i = 0; i < children.length; i++)
            console.log("text of lable", i, ":", children[i].text)
    }
}

另外,我们还可以在自定义属性时添加default关键字,将这个属性作为默认属性。


只读属性——

使用readonly关键字可定义一个只读属性,语法如下:

readonly property <propertyType> <propertyName> : <initialValue>

只读属性必须初始化,且不能修改,也不能是default属性和alias属性,如下所示:

Item {
    readonly property int someNumber: 10
    Component.onCompleted: someNumber = 20  // TypeError: Cannot assign to read-only property 	"someNumber"
}


附加属性——

QML语言还包括了一些附加属性和信号处理器,由相应的附加类型提供,使用语法如下:

<AttachingType>.<propertyName>
<AttachingType>.on<SignalName>

在前面的例子中,Component.onCompleted就是一个附加信号处理器,在某些情况下,一个对象的附加属性和信号处理器只对特定的对象有效,如ListViewdelegate属性直接授权的对象,而不能在其子对象中直接使用,使用时需要格外注意。

### 回答1: Qt QML仪表Demo是一个用于展示仪表效果的示例程序,通过使用Qt框架中的QML语言进行开发。QML是一种用于构建用户界面的声明式语言,它可以与C++代码无缝交互,并且可以跨平台运行。 这个仪表Demo通常包含一个圆形的仪表盘,上面显示着一些指针和刻度,用于表示某种状态或数值。这个示例程序可以用来演示一些实际应用场景,如车辆仪表盘、仪器仪表等。 在QML文件中,我们可以定义一个圆形的画布并在上面绘制各种图形元素。例如,我们可以添加一个圆形的外环作为仪表盘的边框,然后在中间添加一个圆形的刻度盘,并绘制出不同的刻度线。接着,我们可以添加指针和数字等元素,来显示具体的数值。 在QML中,我们可以使用一些内置的属性和表达式来实现各种动画效果。比如,我们可以定义一个动画来实现指针的旋转,使其根据仪表盘上的值进行相应的角度调整。还可以通过属性绑定来实时更新仪表盘的数值显示。 除了基本的仪表功能,我们还可以通过QML的扩展性来添加更多的交互功能。例如,通过添加鼠标事件处理器或触摸事件处理器,我们可以让用户通过拖动、滑动等方式来手动调整仪表盘的数值。 总之,Qt QML仪表Demo是一个通过使用Qt框架中的QML语言开发的示例程序,用于展示仪表效果。它可以帮助开发者更好地理解和学习QML的使用方法,并将其应用于实际项目中。 ### 回答2: Qt QML仪表Demo是一个使用Qt Quick绘制仪表盘界面的示例程序。QML是一种声明性语言,用于构建基于Qt的用户界面。 该示例程序展示了如何使用QML绘制一个具有平滑动画效果的仪表盘界面。在这个示例中,仪表盘界面由一个圆形背景、一个指针和一些标签组成。 首先,通过QML的绘图元素Path绘制一个圆形背景。可以设置背景的颜色、半径和边框。然后,使用Item元素嵌套一个Rectangle元素,用作指针。可以根据仪表盘当前值计算指针的角度,并将其旋转到正确的位置。 除了绘制背景和指针,示例中还包含一些标签,用于显示仪表盘的范围和单位。这些标签可以使用Text元素和属性绑定来实现。可以根据需要设置标签的颜色、大小和位置。 示例程序还包含一些动画效果,用于平滑地过渡指针的位置。可以使用Behavior元素和属性动画来定义这些效果。例如,可以定义一个角度动画,使指针在数值改变时顺时针或逆时针旋转到新的位置。 为了实现用户交互,示例程序还使用了一些QML的交互元素,如Slider和Button。可以通过Slider来改变仪表盘的数值,从而实现指针的动态变化。而Button可以用于重置仪表盘的数值。 综上所述,Qt QML仪表Demo是一个使用Qt Quick绘制仪表盘界面的示例程序,通过展示QML的绘图元素、属性绑定、动画效果和用户交互来实现这个功能。 ### 回答3: Qt QML仪表Demo是一个基于Qt Quick和QML语言编写的示例应用程序,用于展示仪表盘的功能和样式。 该示例应用程序主要由以下几个部分组成: 1. 仪表盘组件:通过使用Qt Quick Controls组件库中的样式,可以创建一个美观和交互性强的仪表盘界面。例如,可以使用圆形进度条来显示速度、转速等信息,并使用指针在刻度上指示当前数值。 2. 数据模型:为了展示仪表盘的功能,需要使用数据模型来模拟一些实际的数值。可以创建一个虚拟的数据模型,包含一些属性,如速度、转速等,并使用属性绑定机制将这些属性与仪表盘组件上的对应属性绑定起来。 3. 用户交互:通过用户交互,可以实现一些仪表盘的交互功能。例如,可以通过滑动或点击来改变仪表盘上的数值,或者通过A/B按钮来切换仪表盘的显示模式。 4. 动画效果:使用Qt Quick的动画系统,可以为仪表盘组件添加一些动画效果。例如,在数值变化时可以添加一个渐变动画效果,使仪表盘的指针从一个数值平滑过渡到另一个数值。 Qt QML仪表Demo不仅可以作为一个示例应用程序来展示如何创建仪表盘界面,还可以作为一个基础框架,用于开发具有仪表盘功能的实际应用程序。通过修改和扩展仪表盘组件、数据模型和用户交互等部分,可以满足不同应用场景的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值