全面认识 Qt Widgets、QML、Qt Quick
扫描二维码
随时随地手机看文章
Qt Widgets、QML、Qt Quick ... 呃 (⊙﹏⊙) ,简直了,傻傻分不清楚 !
哈哈,没关系,来全面认识一下,也许还有一些你不知道的秘密哦!
1QML 和 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 代码集成在一起。2QtQuick 1.x 和 QtQuick 2.x 有什么差异?
QtQuick 主要包含 1.x 和 2.x,它们之间的主要区别是:
- 全新的 Qt 版本QtQuick 1.x 基于 Qt 4.x;QtQuick 2.x 随 Qt 5.0 一起引入。
- 全新的绘图系统QtQuick 1.x 使用 QGhicsView/QPainter API 来绘制场景;QtQuick 2.x 基于 Scene Graph,一个 OpenGL(ES)2.0 抽象层,对绘图进行了高度优化,效率更高。
- 全新的 QML 引擎Qt 4.x 中,QML 引擎基于JSC(JavaScriptCore - Webkit 的 JS 引擎);Qt 5.0 中引入 V8(Google 的开源高性能 JavaScript 引擎,用 C 编写,用于 Chromium、Node.js 和多个其他嵌入应用程序);Qt 5.2 中引入了 V4 JS 引擎,针对 QML 用例进行了优化,并且可以选择关闭 JIT(Just-In-Time)编译,以符合 iOS 和 WinRT 平台的限制。个头更小、反应更快、扩展性也非常好。
- 从 Qt 5.5 开始,加入了一个新模块 QtQuick3D,它提供使用 QML 语言创建 3D 应用程序/游戏的能力,其使用的是一个被命名为 FrameGraph 的新引擎,而非 Scene Graph(因为太 2D/2.4D)。
- 模块、属性和方法、类型和 API、C 代码(QtDeclarative 被移除了,替代的它是 Qt QML 和 Qt Quick 模块)、QML 插件的更改。
- ......
3为什么要引入 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 代码进行访问。
4Qt 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 以编程方式进行设计和布局。
5Qt Widgets 和 Qt Quick 该如何选择?
在 Qt 4.7 发布时,引入了 QML,用于移动开发,其全面支持触摸操作、流畅的动画效果等。但在 Qt 5 中,QML 已经不再局限于移动开发,也可用于开发传统的桌面程序。
很长时间里,我都在使用 Qt Widgets。当第一次尝试 QML 时,发现它太原始。但随着 Qt 5 的持续更新,它已经得到了很大的改善(更多的功能、更好的性能、以及更多的平台支持)。话虽如此,但 Qt Quick 仍在发展,随着版本的更新,也会变得越来越成熟。
相比之下,Qt Widgets 更老、更成熟,而 QML/Qt Quick 则更新、更现代。但无论如何,Qt Widgets 和 Qt Quick 都可以在多个平台上(Windows、Linux、OS X)使用。
对于传统的桌面程序来说,应优先考虑使用 Qt Widgets,
若要开发更现代的 UI 与高级应用,建议使用 Qt Quick。对于移动端开发来说,建议使用 Qt Quick,
协同 JavaScript,简单快捷、渲染效果更佳、界面更炫酷。不建议使用 Qt Widgets,其显示效果、适应性都不好。6给新手的建议
如果你对编程完全陌生,建议先从 Qt Quick 学起。
就个人而言,我认为 Qt Quick 有一个更温和的学习曲线,更容易用它来快速完成项目。想想看,能被称为 Quick 一定是有原因的(不过,也不要小看 Qt Widgets,它也有一些比 Qt Quick 更棒的模块)。但是,
如果你以前使用过 C 或 Python,建议先看看 Qt Widgets,
并熟悉它里面的一些核心机制(例如:事件、信号槽),以及必要的模块(例如:gui、network)。最后,无论选择 Qt Widget 还是 Qt Quiget="_blank">ck,都不用太过担心上手的问题,因为 Qt 提供了丰富的示例(当然:也别忘了我 )。
·END·
高效程序员谈天 · 说地 · 侃代码 · 开车ic.com/weixin/tr/2021-07/19/508qeryv103.jpg">长按识别二维码,解锁更多精彩内容