内容发布更新时间 : 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
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
这里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
例如: