#(76):QML 和 QtQuick 2 前面我们已经了解了 Qt 的一部分内容。这部分内容全部集中在 C++ 方面。也就是说,至今为止我们的程序都是使用 C++ 语言完成的。这在 Qt 5 之前的版本中是唯一的途径。不过,自从 Qt 5 开始,情况有了变化。事实上,从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。在 Qt 5 中,QML 有了长足进步,并且同 C++ 并列成为 Qt 的首选编程语言。也就是说,使用 Qt 5,我们不仅可以使用 C++ 开发 Qt 程序,而且可以使用 QML。虽然 QML 是解释型语言,性能要比 C++ 低一些,但是新版 QML 使用 V8,Qt 5.2 又引入了专为 QML 优化的 V4 引擎,使得其性能不再有明显降低。在 Nokia 发布 Qt 4.7 的时候,QML 被用于开发手机应用程序,全面支持触摸操作、流畅的动画效果等。但是在 Qt 5 中,QML 已经不仅限于开发手机应用,也可以用户开发传统的桌面程序。 QML 文档描述了一个对象树。QML 元素包含了其构造块、图形元素(矩形、图片等)和行为(例如动画、切换等)。这些 QML 元素按照一定的嵌套关系构成复杂的组件,供用户交互。 本章我们先来编写一个简单的 QML 程序,了解 QML 的基本概念。需要注意的是,这里的 Qt Quick 使用的是 Qt Quick 2 版本,与 Qt 4.x 提供的 Qt Quick 1 不兼容。 首先,使用 Qt Creator 创建一个 Qt Quick Application。在之后的 Qt Quick Component 选项中,我们选择 Qt Quick 2.0: [![](https://box.kancloud.cn/2015-12-29_5682327da6bcb.png)](http://files.devbean.net/images/2013/12/qq-pro-setting.png) 完成创建之后,我们可以看到一个 QML 项目所需要的基本文件。这里的项目名字为 qqdemo,而且有一个自己添加的资源文件,所以这个示意图可能与你的不同。 [![](https://box.kancloud.cn/2015-12-29_5682327dbff9e.png)](http://files.devbean.net/images/2013/12/qq-pro-files.png) qtquick2applicationviewer 里面的内容是 Qt Creator 帮助我们生成的,这里面的文件一般不会修改。我们可以认为这个文件夹下的文件就是运行 QML 的一个加载器。Application Viewer 用于加载 QML 文件并将其解释显示,类似于浏览器解释运行网页。 我们真正关心的是 main.qml 里面的内容: import QtQuick 2.0 Rectangle { width: 360 height: 360 Text { text: qsTr("Hello World") anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: { Qt.quit(); 这段代码看起来很简单,事实也的确如此。一个 QML 文档分为 import 和 declaration 两部分。前者用于引入文档中所需要的组件(有可能是类库,也可以是一个 JavaScript 文件或者另外的 QML 文件);后者用于声明本文档中的 QML 元素。 第一行,我们使用`import`语句引入 QtQuick 2.0。由于这只是一个示例程序,所以我们没有引入更多的内容。 每一个 QML 有且只有一个根元素,类似于 XML 文档。这个根元素就是这个 QML 文档中定义的 QML 元素,在这个例子中就是一个`Rectangle`对象。注意一下这个 QML 文档的具体语法,非常类似于 JSON 的定义,使用键值对的形式区分元素属性。所以我们能够很清楚看到,我们定义了一个矩形,宽度为 360 像素,高度为 360 像素。记得我们说过,QML 文档定义了一个对象树,所以 QML 文档中元素是可以嵌套的。在这个矩形中,我们又增加了一个`Text`元素,顾名思义,就是一个文本。`Text`显示的是 Hello World 字符串,而这个字符串是由`qsTr()`函数返回的。`qsTr()`函数就是`QObject::tr()`函数的 QML 版本,用于返回可翻译的字符串。`Text`的位置则是由锚点(anchor)定义。示例中的`Text`位置定义为 parent 中心,其中`parent`属性就是这个元素所在的外部的元素。同理,我们可以看到`MouseArea`是充满父元素的。`MouseArea`还有一个`onClicked`属性。这是一个回调,也就是鼠标点击事件。`MouseArea`可以看作是可以相应鼠标事件的区域。当点击事件发出时,就会执行`onClicked`中的代码。这段代码其实是让整个程序退出。注意我们的`MouseArea`充满整个矩形,所以整个区域都可以接受鼠标事件。 当我们运行这个项目时,我们就可以看到一个宽和高都是 360 像素的矩形,中央有一行文本,鼠标点击矩形任意区域就会使其退出: ![](https://box.kancloud.cn/2015-12-29_5682327dd658a.png) 接下来我们可以改变 main.qml 文件中的“Hello World”字符串,不重新编译直接运行,就会看到运行结果也会相应的变化。这说明 QML 文档是运行时解释的,不需要经过编译。所以,利用 QML 的解释执行的特性,QML 尤其适合于快速开发和原型建模。另外,由于 QML 比 C++ 简单很多,所以 QML 也适用于提供插件等机制。
  • (2)Qt 简介
  • (3)Hello, world!
  • (4)信号槽
  • (5)自定义信号槽
  • (6)Qt 模块简介
  • (7)MainWindow 简介
  • (8)添加动作
  • (9)资源文件
  • (10)对象模型
  • (11)布局管理器
  • (12)菜单栏、工具栏和状态栏
  • (13)对话框简介
  • (14)对话框数据传递
  • (15)标准对话框 QMessageBox
  • (16)深入 Qt5 信号槽新语法
  • (17)文件对话框
  • (18)事件
  • (19)事件的接受与忽略
  • (21)事件过滤器
  • (22)事件总结
  • (23)自定义事件
  • (24)Qt 绘制系统简介
  • (25)画刷和画笔
  • (26)反走样
  • (27)渐变
  • (28)坐标系统
  • (29)绘制设备
  • (30)Graphics View Framework
  • (31)贪吃蛇游戏(1)
  • (32)贪吃蛇游戏(2)
  • (33)贪吃蛇游戏(3)
  • (34)贪吃蛇游戏(4)
  • (35)文件
  • (36)二进制文件读写
  • (37)文本文件读写
  • (38)存储容器
  • (39)遍历容器
  • (40)隐式数据共享
  • (41)model/view 架构
  • (42)QListWidget、QTreeWidget 和 QTableWidget
  • (43)QStringListModel
  • (44)QFileSystemModel
  • (45)模型
  • (46)视图和委托
  • (47)视图选择
  • (48)QSortFilterProxyModel
  • (49)自定义只读模型
  • (50)自定义可编辑模型
  • (51)布尔表达式树模型
  • (52)使用拖放
  • (53)自定义拖放数据
  • (54)剪贴板
  • (55)数据库操作
  • (56)使用模型操作数据库
  • (57)可视化显示数据库数据
  • (58)编辑数据库外键
  • (59)使用流处理 XML
  • (60)使用 DOM 处理 XML
  • (61)使用 SAX 处理 XML
  • (62)保存 XML
  • (63)使用 QJson 处理 JSON
  • (64)使用 QJsonDocument 处理 JSON
  • (65)访问网络(1)
  • (66)访问网络(2)
  • (67)访问网络(3)
  • (68)访问网络(4)
  • (69)进程
  • (70)进程间通信
  • (71)线程简介
  • (72)线程和事件循环
  • (73)Qt 线程相关类
  • (74)线程和 QObject
  • (75)线程总结
  • (76)QML 和 QtQuick 2
  • (77)QML 语法
  • (78)QML 基本元素
  • (79)QML 组件
  • (80)定位器
  • (81)元素布局
  • (82)输入元素
  • (83)Qt Quick Controls
  • (84)Repeater
  • (85)动态视图
  • (86)视图代理
  • (87)模型-视图高级技术
  • (88)Canvas
  • (89)Canvas(续)
  •