Qt QML入门– QML 语法 下载本文

内容发布更新时间 : 2024/12/22 20:35:57星期一 下面是文章的全部内容请认真阅读。

Qt QML入门– QML 语法

QML是一种描述性的脚本语言,文件格式以.qml结尾。语法格式非常像CSS(参考后文具体例子),但又支持javascript形式的编程控制。我个人认为它结合了QtDesigner UI和QtScript的优点。QtDesigner可以设计出.ui界面文件,但是不支持和Qt原生C++代码的交互。QtScript可以和Qt原生代码进行交互,但是有一个缺点,如果要在脚本中创建一个继承于QObject的图形对象非常不方便,只能在Qt代码中创建图形对象,然后从QtScript中进行访问。而QML可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C++代码进行方便的交互,使用起来非常方便。 QML是Qt推出的Qt Quick技术的一部分,是一种新增的简便易学的语言。

QML是一种陈述性语言,用来描述一个程序的用户界面:无论是什么样子,以

及它如何表现。在QML,一个用户界面被指定为具有属性的对象树。 这使得Qt更加便于很少或没有编程经验的人使用。

发表于 2013 年 2 月 3 日

? QML 对象的属性 ? ? id Property Attributes ? ? ? ? 为Property Attributes赋值 属性组 属性别名 Property Modifier Objects Property Change Signal Handlers ? 信号 ? ? ? 方法 附带的属性和附带的信号处理函数 QML 对象的属性 一个QML对象所具有的属性有以下几种: ?

id -id 标识

? property attributes –属性(其中包括继承自Item的attributes,自定义的attributes) signal attributes –信号 signal handler attributes –信号处理 method attributes –函数 attached propeties and attached signal handler attributes –附带的属性 和 附带的signal handler ? ? ? ? id id 用来标识QML对象,id不能够以大写字母开头,同样method也不能够以大写字母开头。请记住这点,不然就会有“xxx cannot begin with an upper case letter”这样的error。 有了id你就能够通过id引用id为xxx的对象了。所以尽量的给你的每个QML object都写上id吧! QML object 一旦实例化,id值就无法改变。 Property Attributes 自定义属性的语法格式: [default] property 例如: property int myAge 25; default property string myName thuai //MyCustomRectangle.qml property MyCustomRectangle myCusRect property color myFavoriteColor: \ default关键字表示,该QML object有个默认属性,你使用这个属性的时候不需要显式的声明。 例如: // MyLabel.qml import QtQuick 2.0 Text { default property var someText

text: \ + someText.text }

上面的MyLabel类型中中有个default属性someText,所以在MyLable使用的时候,

MyLabel {

Text { text: \ } }

//和这段代码是等效的 MyLable {

someText: Text { text: \ } }

这就是default property

单行语句的分号是可写不用写的。但是一行写多条语句,语句则必须要用分号分隔! propertyType 可以是QML的基本类型,一种QML对象类型,也可以是QML可以是C++通过Q_PROPERTY宏注册的类,还可以是JavaScript中的var,var它可以表示任何类型的数据,还可以是自定义的QML类型,如MyCustomRectangle

为PROPERTY ATTRIBUTES赋值

?

一是初始化的时候赋值

import QtQuick 2.0 Item{ x: 10 y: 10 width: 100 height: 100 }

?

一是使用的时候赋值。

import QtQuick 2.0 Rectangle { id: rect Component.OnCompleted: { rect.color = “blue” } }

属性组(GROUPED PROPERTIES)

将相同的属性写成一句代码 例如:

Text {

//dot notation font.pixelSize: 12 font.b: true }

Text {

//group notation

font { pixelSize: 12; b: true } }

font.pixelSize 和 font.blod用括号括起来写成了一句,注意 pixelSize和 b之间有个 ;

属性别名(PROPERTY ALIASES)

格式: [default] property alias :

// Button.qml import QtQuick 2.0

Rectangle {

property alias buttonText: textItem.text

width: 100; height: 30; color: \

Text { id: textItem } }

Button中的属性buttonText是textItem.text属性的别名

Button { buttonText: \ }

所以对Button的buttonText属性赋值就相当于给Text的text属性赋值

注意: Property Aliases 必须在组件所有初始化工作都完成之后,才能够使用,否则会出错。

import QtQuick 2.0

Rectangle { width: 360 height: 360

property alias aText: te

//error before Rectangle initialized completed //aText: \

Component.onCompleted: {

aText.text = \ }

Text { id: te

anchors.centerIn: parent }

}

如果你在component初始化完成,对alias properties赋初始值,QtCreator会报“Cannot assign to non-existent property “aText”错误!

这里又看到了一个有意思的东西。Component.onCompleted,这是一个QtQuick所有的Object都有的一个附带信号处理函数。组件初始化创建完成就会触发这个处理函数。后面在关于signal的文章中有更详细的讲解。

PROPERTY MODIFIER OBJECTS

on { // attributes of the object instance }

这里Property Modifier Objects我没有用中文,因为我也不知道该译成什么。具体后面的例子中大家可以看到Property Modifier Objects的应用。如下面代码中的NumberAnimation

import QtQuick 2.0

Rectangle { width: 360 height: 360

Rectangle { id: moveRect width: 50 height: 50 radius: 5 color: \

NumberAnimation on x { from: 0 to: 100 duration: 200 } } }

信号(Signal Attributes) 信号属性定义语法:

signal [([ [, ...]])] []表示可选

例如: