QML语法基础
QML 是一种多范式语言,使对象能够根据其属性以及如何关联和响应其他对象的更改来定义对象。与纯粹的命令式代码相反,属性和行为的变化通过一系列逐步处理的语句表达。QML 的声明性语法将属性和行为更改直接集成到单个对象的定义中,这些属性定义可以包含必要的代码,在情况复杂的自定义应用程序行为是必要的。
QML 源代码通常由引擎通过 QML 文档加载,QML 文档是 QML 代码的独立文档。这些可以用于定义 QML 对象类型,然后可以在整个应用程序中重复使用。
QML 文档可以在文件的顶部包含一个或多个 import 语句。一个 import 可以是以下任何一种:
一个已经注册了类型的版本化命名空间(例如:通过插件) 一个包含 QML 文档类型定义的相对目录 一个 JavaScript 文件
在导入时,JavaScript 文件的导入必须是合格的,以便可以访问其提供的属性和方法。
各种 import 的通用形式如下:
import Namespace VersionMajor.VersionMinor import Namespace VersionMajor.VersionMinor as SingletonTypeIdentifier import "directory" import "file.js" as ScriptIdentifier
例如:
在语法上,一个 QML 代码块定义了一个要被创建的 QML 对象树。使用对象声明来定义对象,对象声明描述了要创建对象的类型以及要给予对象的属性。每个对象也可以使用嵌套对象声明来声明子对象。
一个对象声明包含:
一组花括号{ }: 紧随其(对象类型的名称)后 属性(例如:width)和子对象(例如:Text):在花括号中声明
来看一个简单的对象声明:
这声明了一个类型为 Rectangle 的对象(Rectangle 类型由 QtQuick 模块提供),后跟一组包含为该对象定义属性的花括号,定义的属性是矩形的 width (宽度)、height(高度)和 color(颜色)。
如果上述对象是 QML 文档的一部分,则可以由引擎加载。也就是说,如果源代码用导入 QtQuick 模块的 import 语句来补充(使 Rectangle 类型可用),如下所示:
当放置到 .qml 文件中并由 QML 引擎加载时,上述代码会使用 QtQuick 模块提供的 Rectangle 类型创建一个 Rectangle 对象:
注意:如果对象定义只有少量的属性,可以写在单行,用分号分隔:
Rectangle { width: 300; height: 200; color: "green" }
显然,这个例子中声明的 Rectangle 对象很简单,因为只定义了几个属性值。为了创建更多有用的对象,对象声明可以定义许多其他类型的属性(在下一节中讨论)。另外,对象声明还可以定义子对象,如下所述。
任何对象声明都可以通过嵌套的对象声明来定义子对象。通过这种方式,任何对象声明隐式声明了一个对象树,可以包含任意数量的子对象。
例如,下面的 Rectangle 对象声明包含了一个 Gradient 对象声明,Gradient 又包含了两个 GradientStop 声明:
GradientStop { position: 0.0; color: "yellow" } GradientStop { position: 1.0; color: "green" } }
当代码被引擎加载时,会创建一个对象树,在根处有一个 Rectangle 对象;这个对象有一个 Gradient 子对象,Gradient 又有两个 GradientStop 子对象。
然而,这是一个在 QML 对象树的上下文中的父子关系,而不是在视觉场景的上下文中。在视觉场景中的父子关系的概念由来自 QtQuick 模块的 Item 类型提供,QtQuick 模块是大多数 QML 类型的基本类型,因为大多数 QML 对象旨在可视化地呈现。
例如,Rectangle 和 Text 都是基于 Item 的类型,而在下面,一个 Text 对象已经被声明为一个 Rectangle 对象的可视化子对象:
import QtQuick 2.3 Rectangle { width: 300 height: 200 color: "green" Text { anchors.centerIn: parent text: "Hello, QML!" }
在上述代码中,当 Text 对象引用它的 parent 值时,指的是它的视觉 parent,而不是对象树中的 parent。在这种情况下,它们是一样的:Rectangle 对象既是 QML 对象树,又是视觉场景的上下文中的 Text 对象的 parent。然而,尽管可以修改 parent 属性以更改视觉父对象,但是对象树的上下文中的一个对象的父对象不能从 QML 更改。
(另外,请注意,Text 对象已经被声明了,而没有赋值给 Rectangle 的属性,这与将 Gradient 对象赋值给 Rectangle 的 gradient 属性的前面的例子不同,这是因为 Item 的 children 属性已经被设置为类型的默认属性来启用这个更方便的语法。)
在 QML 中,注释的语法与 JavaScript 类似:
有助于解释代码以提高其可读性,便于日后自己参考或者他人阅读。 用于防止代码执行,这有时对跟踪问题非常有用。
Text { text: "Hello QML!" //opacity: 0.5 }
这时,Text 对象将具有正常的透明度,因为行 opacity: 0.5 已经被注释掉了。
项目验收时,序猿演示功能,猛戳按钮愣是没反应。。。闷头走向工位,打开源码,发现了神奇的 // TODO
Python GUI编程:PySide2页面设计优化 通过之前的文章,我们发现:在拖拽控件的时候,页面每一个控件的名称没有跳转,都是用的默认的,这样不方便后期去按钮,输入框等进行其他相关操作,会导致代码可读性差,接下来可以进行优化。
相关文章
- 鸟哥的Linux私房菜——基础学习篇 —— 笔记2
- Java实现蓝桥杯基础练习特殊回文数
- 5-2python语法基础-异常操作
- 6-1python语法基础-面向对象-类的定义属性和方法,类的作用域,类的封装继承多态,类的反射,单例模式
- 2-2python语法基础-基础-赋值与深浅拷贝
- 小白学 Python(11):基础数据结构(元组)
- 大数据基础之Hadoop(2)hdfs和yarn最简绿色部署
- 大数据基础之Impala(1)简介、安装、使用
- 《Gradle权威指南》--Gradle构建脚本基础
- go基础语法:切片的定义
- sourceTree 基础使用
- vue学习资料:vue笔记ppt整理(vue基础指令&vue基础语法)
- Android kotlin 系列讲解(基础篇) 高级语法let函数、apply函数、also函数、run函数和with函数
- mysql常用基础操作语法(十)~~子查询【命令行模式】
- 一天学完spark的Scala基础语法教程七、数组(idea版本)
- 猿创征文|Python基础——Visual Studio版本——DBHelper-MySQL版本
- Java递归基础案例-斐波纳契数列
- JavaScript基础语法(流程控制语句)
- JavaScript基础语法(运算符)
- 第20篇 基础(二十)详解QStringList
- JavaSE学习总结(二)——Java语言基础
- 都22年了,0基础做软件测试真的还有前途么?
- Docker基础命令学习
- 一天学完spark的Scala基础语法教程七、数组(idea版本)