2019独角兽企业重金招聘Python工程师标准>>> hot3.png

关于框架

Qt这个框架历史悠久,由于当年桌面操作系统的GUI程序开发比较费劲,一般使用普通语言如c、c++或者平台自身提供的难用框架,windows、Linux、mac各有各的不同机制。1991–Haavard Nord和Eirik Chambe-Eng开始开发将会支持X11和Windows的Qt,1994–奇趣科技公司成立,主要提供跨平台、面向对象、易用的GUI程序开发框架。另外随着Qt诞生的还有KDE,一个为Linux提供图形界面的开发库和框架。

随着逐渐的发展和社会的需求,Qt版本不断演化,功能不断增多。比如经典的Qt4系列,当年为满足嵌入式开发提供的Qt/Embedded。现在这些版本已经退出舞台。一直以来,对Qt影响比较大的转折点一是2008 Nokia从Trolltech公司收购Qt,二是2012 Aug 09 诺基亚正式放弃该框架。

诺基亚收购Qt是因为从那时起,智能手机开始流行,最早的iphone发布,android也开始发展,而Qt是当时是比较流行的嵌入式设备开发框架。单从时间节点看,诺基亚在智能手机发展初期并没用太落后,只是后来的发展过程比较缓慢,逐渐和苹果、android拉开了距离。

Qt被诺基亚收购后,其开发方向在跨平台的同时,主要面向新的基于Linux的智能手机操作系统。由于Qtwidget本身不适合触摸操作,于是伟大的QML技术诞生,QML是专为可触摸界面定制的开发语言,构成了meego系统的界面框架。随着不断的发展,诺基亚在智能手机方面被苹果和谷歌甩的更远,最终放弃手机业务。Qt也被移交给了另一家芬兰公司。

从这时候起,Qt开始进入5的时代。技术架构方面有了彻底的变化,主要是更细粒度的模块化和重点转向基于opengl的QML、QtQuick技术开发。这个时候的QML继承了诺基亚的遗产,并且彻底转向以opengl为底层,使得绘图性能更好,更适合现代图形界面开发。Qt技术的演变一直以来都是很自然的,符合社会对很多方面的需要,当然,由于其是一个开源项目,没有了实力资本的支持,Qt一直以来 很多模块要么缺少功能,要么bug比较多。直到目前(2016),Qt5.6系列发布长期支持版本,这才标志着Qt5系列已经相对比较稳定。当然,新功能的增加和优化还是会根据需求继续发展。

关于架构和模块

Qt5开始更加注重模块化,从上层逻辑上分为Qt Essentials、Qt Add-Ons、Technology Preview、商业模块和tools 几部分。代码层面,Qt Essentials中除QML部分模块如qtdeclarative.git、qtquickcontrols.git为独立仓库,其包含的多数模块在qtbase.git仓库,如Core, Gui, Widgets, Network等。其它Add-Ons、技术预览模块一般为独立仓库。另外还有工具类如widget设计器、帮助系统、安装程序制作、构建系统、QtCreator、SDK等周边项目。

随着需求的不断变化,Qt5新增了很多功能,已经不仅仅是开发界面,而是成为功能丰富的多用途框架。其中一些新功能放进了基础模块,一些以独立的附件模块提供。下面是Qt Essentials架构:

Module

Description

Qt Core

被其它模块用到的非图形模块类

Qt GUI

用于GUI界面开发的基础类,包含 OpenGL.

Qt Multimedia

用于多媒体开发的音频、视频、无线和相机功能

Qt Multimedia Widgets

上述功能的widgets实现,方便开发

Qt Network

网络功能

Qt QML

QML和javascript解析引擎

Qt Quick

基于上述语言的现代界面和功能开发框架

Qt Quick Controls

用于开发具有传统桌面风格的qml控件

Qt Quick Dialogs

各种qml实现的对话框

Qt Quick Layouts

用于qml界面开发的布局工具

Qt SQL

数据库抽象

Qt Test

测试

Qt Widgets

基于widget的GUI开发控件

其它附加模块请参考官方文档。

关于跨平台和移植

Qt自身的属性就是跨平台,即相同功能的api可以在各个平台编译运行。为了尽可能达到此目的,势必会照顾各平台共有的特性和约束,另外一些平台专有的功能以Extras模块提供。因为跨平台的特性,所以注定了其在各平台上并不是最优化方案,一般各平台的原生开发语言和框架在很多方面要优于Qt。

虽然Qt本身是C++,但由于各平台有自己的原生语言,如android,并且上层的api都是通过这些语言导出,虽然Qt可以通过封装的形式调用,但无形中添加了很多步骤,性能上可能会有点折扣。

关于Linux移植方面,对于Qt Essentials的多数模块,一般只需要移植widget的窗口系统、QtQuick的opengl层、Multimedia需要的音视频库,驱动的移植较少。而对于其它模块,如传感器,这些模块和设备绑定的关系比较密切,除了中间库,很大程度上还需要自己移植对应的硬件驱动。

一般如果想要搭建一个基于Qt的平台,建议的途径是选一个适合应用场景的开源Linux分之,一般要对Qt有较好的支持。在这些分之中,Qt移植相关的工作如安装包文件的建立等基本已经做好,自己参考修改用于新的Qt版本即可。另外所选的Linux分之要尽可能有着不错的activity和维护支持,不到迫不得已,不建议自己维护Linux分之。

移植工作有时候是很恶心的事情,Qt本身是一个上层api框架,很多功能需要调用其它中间件实现。而Linux上比较麻烦的就是软件的管理,一是版本二是依赖关系。可能为了使某功能工作,需要依赖库A,而A又依赖B,B又依赖其它乱七八糟的库。依赖解决后,如果库的版本不符合要求,一般会产生二进制兼容问题导致程序无法运行和莫名其妙问题。

现状评价和方案选择

总体上,现阶段的Qt已经可以满足很多需求,性能和体验上有所提升(当然还有各种缺陷)。目前,真正的基于操作系统的嵌入设备开发一般会选择改造的android,由于android系统的完善及应用支持,这方面的优势要远远大于Linux+Qt。而Qt一般可以用于一些对应用数量要求不多,驱动设备不是很多,界面需要灵活定制的应用场景,这方面Qt具有一定的优势。

而如果能将硬件驱动支持、应用数量、Qt的灵活性结合,则优势会更好。具体需要根据应用场景选择,比如做手机系统,Qt虽然灵活,但缺乏丰富的应用生态,在现在的市场下,不太适合。一般选择Qt,要么是应用数量要求不高,要么就得自己搭建生态环境。另外硬件的驱动支持也是重要的参考。很多方案都只提供android开发包,Linux的东西较少。虽然有技术可以让Linux利用android驱动,但这种绕弯子的方式可能没有直接使用android有效率。

另外对于物联网等应用,一般不需要图形界面,所用的芯片一般为单片机,跑Linux不合适。当然,在设备成本不敏感的情况下,不觉得浪费或者跑Linux更合适的场景下,Linux+Qt也是选择之一,另外还可以用嵌入式web服务。

转载于:https://my.oschina.net/assange/blog/614198

Qt5及模块架构分析相关推荐

  1. java bs架构书_基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品)

    基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品) 来源:2BYSJ.cn 资料编号:2SJ295500 资料等级:★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5% ...

  2. 指纹模块流程分析(一)之Fingerprint模块架构

    一.Fingerprint模块架构 Fingerprint模块架构图如下,这里分为application,framework,fingerprintd和FingerprintHal这几个部分,不涉及指 ...

  3. pass基础架构分析

    pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...

  4. Yolov3网络架构分析

    Yolov3网络架构分析 上图三个蓝色方框内表示Yolov3的三个基本组件:  CBL:Yolov3网络结构中的最小组件,由Conv+Bn+Leaky_relu激活函数三者组成.  Res uni ...

  5. YOLOV4各个创新功能模块技术分析(三)

    YOLOV4各个创新功能模块技术分析(三) 八.数据增强相关-Stylized-ImageNet 论文名称:ImageNet-trained cnns are biased towards textu ...

  6. 模块架构不是软件成功的“决定因素”

    [本文是09年的一篇旧文,出于某些原因,对原文内容有删减,在这里整理后重新发表] 前言 感谢XXX对我们技术,对我们公司产品提出这些意见,我们公司卖的是软件产品,开发软件是一件技术活,说实话,要把技术 ...

  7. 转:秒杀系统架构分析与实战

    原文出处: 陶邦仁   欢迎分享原创到伯乐头条 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单: ...

  8. 【从零学习OpenCV 4】了解OpenCV的模块架构

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

  9. 《libGDX移动游戏开发从入门到精通》一第2章 libGDX的架构分析

    本节书摘来异步社区<libGDX移动游戏开发从入门到精通>一书中的第2章,第2.1节,作者: 黄俊东 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

最新文章

  1. 举例说明信息熵、互信息的计算过程
  2. Matlab中凸优化工具包CVX的配置、注册与使用
  3. lm723大电流可调电源电路图_TE:大电流电源连接器
  4. RabbitMQ队列持久化
  5. 袁桂英(帮别人名字作诗)
  6. Google拒绝因搜索不良信息被传唤
  7. 北斗导航 | RAIM:基于速率监测的GNSS/INS完好性监测
  8. 阿里矢量图标库项目添加合作者
  9. 计算机组装与维修教学工作总结,计算机组装与维护教师工作总结
  10. Hadoop3.2.1 【 HDFS 】源码分析 :BlockManager解析 [二]
  11. unity Debug.DrawLine画线
  12. 平年和闰年c语言程序,C语言平年,平年闰年问题
  13. Python 3 《List》入门练习
  14. 车载导航应用的哪些计算机知识,三维模拟智能车载导航系统的设计与实现
  15. 字符串和数组的长度 java c++
  16. 51nod 基础题题解(全)
  17. rstudio安装后如何打开_【R教程】R与RStudio简介及安装
  18. 2009年最受欢迎的十大系统及相关问题教程
  19. VCS User Guide学习笔记【使用精简版】
  20. 关于公司新进员工的培训观感及建议

热门文章

  1. 寻找三角形(编程题)
  2. c语言仓库即存储器,计算机基础4
  3. 消息队列与rabbitMQ的各种问题
  4. 二级Access数据库大纲知识要点
  5. LintCode:尾部的零
  6. 混淆矩阵(TP+FN+FP+TN)
  7. 【java】窗口中监听器的应用
  8. gradle构建java实例_Gradle构建Java应用程序
  9. VS 2015 64位CMake编译openCV3.1.0必备文件
  10. java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】