当前位置:首页 > 嵌入式 > 嵌入式云IOT技术圈
[导读]QtWidgets、QML、QtQuick... 呃(⊙﹏⊙),简直了,傻傻分不清楚 !哈哈,没关系,来全面认识一下,也许还有一些你不知道的秘密哦!1QML和QtQuick是什么关系?从概念上区分QML是一种用户界面规范和标记语言,它允许开发/设计人员创建高性能、流畅的动画和具有...

ic.com/weixin/tr/2021-07/19/023ksnyr532.gif">

Qt Widgets、QML、Qt Quick ... 呃 (⊙﹏⊙) ,简直了,傻傻分不清楚 !


哈哈,没关系,来全面认识一下,也许还有一些你不知道的秘密哦!




1

QML 和 Qt Quick 是什么关系?






从概念上区分



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




这里,主要涉及两点:


  1. 用户界面规范:QML 提供了一种高度可读的、声明式的、类似 JSON 的语法,支持命令式 JavaScript 表达式和动态属性绑定。

  2. 标记语言:像 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 代码集成在一起。



2

QtQuick 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 代码进行访问。



4

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 以编程方式进行设计和布局。



5

Qt 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">

长按识别二维码,解锁更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭