QML和Qt Quick

什么是 QML?

Qt Meta-Object Language,Qt元对象语言,是一种用于描述应用程序用户界面的声明式编程语言,使用一些可视组件以及这些组件之间的交互来描述用户界面。QML是一种高可读性的语言,可以使组件以动态方式进行交互,并且允许组件在用户界面中很容易地实现复用和自定义。

QML允许开发者和设计者以类似的方式创建高性能的、具有流畅的动画效果的、极具视觉吸引力的应用程序。QML提供了一个具有高可读性的类似JSON的声明式语法,并提供了必要的JavaScript语句和动态属性绑定的支持。QML语言和引擎框架由Qt QML模块提供。

Qt QML模块为QML语言开发应用程序和库提供了一个框架。他定于并实现了语言及其引擎架构,并且提供了一个接口,允许应用开发者以自定义类型和集成JavaScript与C++代码的方式来扩展QML语言。Qt QML模块提供了QML和C++两套接口。

什么是 Qt Quick?

Qt Quick是QML的一个数据类型和功能的标准库,包含了可视化类型、交互类型、动画、模型和视图、粒子特效和渲染特效等。在QML应用程序中,可以通过一个简单的import语句来使用该模块提供的所有功能。

QML 和 Qt Quick的关系

从概念上区分

QML 是一种用户界面规范和标记语言,它允许开发/设计人员创建高性能、流畅的动画和具有视觉吸引力的应用程序。

这里,主要涉及两点:

  • 用户界面规范:QML 提供了一种高度可读的、声明式的、类似 JSON 的语法,支持命令式 JavaScript 表达式和动态属性绑定。
  • 标记语言:像 C++ 一样,QML 也是一种语言,它的文件以 .qml 结尾。
    Qt Quick 是 QML 类型和功能的标准库,它包括视觉类型、交互类型、动画、模型和视图、粒子效果和着色效果(可以使用 import 语句访问所有这些功能)。

Qt Quick 使用 QML 作为声明语言,来设计以用户界面为中心的应用程序。严格来讲,Qt Quick 是一个用于 QML 的工具包,允许以 QML 语言来开发图形界面。当然,还有其他的工具包用于 QML:

  • 图形化的(例如:Sailfish Silica 或 BlackBerry Cascades)
  • 非图形的(例如:QBS - QMake/CMake/make … 的一个替代品)

从模块上区分

QML 由 Qt QML 模块提供,QtQuick QML 库由 Qt Quick 模块提供。

  • Qt QML 模块:为 QML 应用程序提供了语言和引擎基础结构。
  • Qt Quick 模块:提供了许多可视化组件、模型视图支持、动画框架以及用于构建用户界面的更多功能。
    总之,GUI 模块是 Qt Quick,QML 是标记语言,它包含一个 JavaScript 运行时来执行 JavaScript,还可以将 QML/JavaScript 代码与 C++ 代码集成在一起。

为什么要引入 QML/Qt Quick?

既然有了 Qt Widgets,为什么还要引入 QML/Qt Quick 呢?主要有以下几方面原因:

  • 战略性发展

Qt 想用 QML/Qt Quick 一统天下(桌面+移动端),梦想还是要有的,万一实现了呢?

众所周知,Qt 为跨平台而生,而 QML/Qt Quick 作为 Qt 新生力量,完完全全继承了 Qt 包罗万象的特点,它的诞生为 Qt 进军移动领域迈出了历史性的一步。

随着 Qt 的不断迭代,QML/Qt Quick 也可用于开发传统的桌面程序,而且效率越来越高,这样以来,便可以用它做任何你想做的事情。

QML/Qt Quick 作为 Qt 的绝对核心,特别是对于界面要求较高的开发者来说,其作用尤为重要。

  • 开发效率的提升

传统上的 native UI 开发普遍使用 C++、C#、Objective-C 等语言。但近年来,本地应用使用 HTML5 + JS 也成为了一种趋势。一方面硬件资源越来越丰富,另一方面 Web 技术让 JS 的解析速度更快。

除此之外,其中一部分功劳要归功于 Google,由于其开源强大(niu bi)的 JS 引擎,Node.js 加上一个前端框架(例如:Electron - 构建跨平台的桌面应用程序)也可以开发本地应用了。

QML/Qt Quick 和 Node.js 类似,也提供了一系列 JS 和 C++ 交互的接口,便于 JS 和 C++ 通信。

  • UI 与逻辑分离

尽管大多数情况下,在编写应用程序时只需 QML 和 JavaScript,但在有些时候,需要计算密集型任务(例如:复杂图像处理、物理引擎),并且需要处理器竭力地提供所有可用的性能。这时,QML 应用开发适合使用 C++ 来进行扩展,以便在后台执行这些密集型任务,而界面设计和一些简单逻辑(例如:按钮变色、换肤)都可以在 JS 中完成。这样避免了传统应用开发前端设计和后台逻辑混合的情况,让界面设计者专心设计界面成为了可能。

由于 QML 是在 Qt 上构建的,因此其继承了 Qt 框架中的大部分功能,尤其是信号槽机制以及元对象系统。使用 C++ 创建的数据可从 QML 直接访问,而 QML 对象也可从 C++ 代码进行访问。

Qt Widgets 和 Qt Quick 有什么区别?

那么,Qt Widgets 和 Qt Quick 之间都有哪些区别呢?从以下几点说起!

  • 语言编码

Qt Widgets 主要使用 C++ 代码(PyQt 和 PySide - Qt 的 Python 绑定,使用的是 Python)。

Qt Quick 主要使用 QML 和 JavaScript。

  • 性能差异

与 Qt Quick 相比,Qt Widgets 更底层一些。但从长远角度来看,Qt Widgets 性能更好、运行得更快。当然,处于底层是有好处的,这可以让 Qt Widgets 更多地暴露于 native API (QtCore 模块、Qt Style Sheets 等)。也就是说,它常用于桌面开发。

Qt Quick 更适合移动开发(尽管可用于桌面开发),它有随时可用的弹出窗口、动画、滑动、抽屉和常用控件,在移动开发中无处不在。

  • UI 设计

它们都可以与 Qt Designer 一起工作,并生成相应的 ui 文件(在 Qt Widgets 中,文件后缀是 .ui;而在 Qt Quick 中,文件后缀是 .ui.qml),为设置布局和创建接口提供了一个高级视图。

ui 文件不是强制性的,也不是必需的,可以选择使用 C++/Python 或 QML/JS 以编程方式进行设计和布局。

参考

全面认识 Qt Widgets、QML、Qt Quick

猜你喜欢

转载自blog.csdn.net/Tom942067059/article/details/129994143
今日推荐