目录
1、什么是 Qt ?
2、Qt 可以用来做什么?
3、Qt 的由来与发展
3.1、Qt 的起源与发展
3.2、Qt 发展经历的三家公司
4、为什么选择 Qt ?
5、Qt 支持的平台
6、Qt 的授权模式
7、Qt 版本的选择
8、选择 QML 还是 Qt Widgets?
8.1、什么是 Widgets ?
8.2、什么是 QML ?
8.3、Widgets 与 QML 工程的创建以及各自的描述文件
8.4、Widgets 和 QML 的比较
8.5、如何选择 Widgets 和 QML ?
9、Qt 开发环境搭建
10、Qt 程序发布
11、GUI 应用程序UI界面库介绍
11.1、MFC
11.2、duilib
11.3、Qt
11.4、Chromium UI组件
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html开源组件及数据库技术(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_2276111.html 从 1994 年至今,Qt 已经走过了 20 多年的发展历程,日趋成熟并广受欢迎。作为优秀的跨平台应用开发框架,Qt 在诸多应用领域都有着广泛的应用,很多应用软件都是用 Qt C++ 开发的。如果开发的是Linux平台的UI应用软件,则首选 Qt;如果要开发在 Linux、Windows 或 macOS 等多种平台上运行的软件,跨平台的 Qt 则是很好的选择。那么,Qt到底是什么?为什么要选择Qt?如何了解Qt?本文我们就来带着大家详细了解一下 Qt 的“前世”与“今生”。
1、什么是 Qt ?
Qt 是一个跨平台的C++应用程序开发框架( C++ 应用和 UI 开发库),它不仅仅是一个C++ UI界面库,它更是封装了诸多功能的工具库。它提供给开发者建立图形用户界面所需的功能,广泛用于GUI程序的开发,也可用于非GUI程序的开发。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。
Qt 同 X11上的GTK、Motif、Openwin和Windows上的MFC,WTL,VCL,ATL 是同类型的东西,但是 Qt 支持更多的主流平台,比如Microsoft Windows、GNU/Linux、Mac OS X、Android、iOS、WinCE、UNIX等。
为了方便进行 C++程序的编写和编译,有各种集成开发环境 (Integrated Developing
Environment,IDE),如 Visual Studio 就是 Windows 平台上常见的编写C++程序的IDE。一个IDE不仅提供程序的编辑和编译,一般还提供一套基本类库,用于提供支持平台应用程序开发的各种基本类,如 Visual Studio 可以使用 其自带的MFC框架进行Windows 平台的应用程序开发。
Qt 是一套应用程序开发类库,但与 MFC 不同,Qt 是跨平台的开发类库。Qt 支持 PC 和服务器的平台,包括 Windows、Linux、macOs等,还支持移动和嵌入式操作系统,如iOS、Embedded Linux、Android、WinRT等。跨平台意味着只需编写一次程序,在不同平台上无需改动或只需少许改动后再编译,就可以形成在不同平台上运行的版本。这种跨平台功能为开发者提供了极大的便利。
Qt 包括多达 250个以上的 C++ 类,还提供基于模板的 collections、serialization、file、I/O device、directory management、date/time等类,甚至还包括正则表达式的处理功能,支持 2D/3D 图形渲染,支持 OpenGL等。使用Qt开发的软件,相同的代码可以在任何支持的平台上编译运行,而不需要修改源代码。它会自动根据平台的不同,表现平台特有的图形界面风格。Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件之间的协同工作变得十分简单,使得Qt面向对象且模块化程度更高。
经过多年发展,Qt不但拥有了完备的C++图形库,而且近年来的版本逐渐集成了数据库、OpenGL库、多媒体库、网路、脚本库、XML库、WebKit库等等,其核心库也加入了进程间通信、多线程等模块,极大地丰富了Qt开发大规模复杂跨平台应用程序的能力,真正意义上实现了其研发宗旨 “Code Less; Create More; Deploy Anywhere.”
在这里,给大家重点推荐一下我的几个热门畅销专栏:
专栏1:(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!)
C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931
本专栏根据近几年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的实战问题分析实例,带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!
专栏中的文章都是通过项目实战总结出来的(通过项目实战积累了大量的异常排查素材和案例),有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
专栏2:
C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html
以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!
专栏3:
开源组件及数据库技术https://blog.csdn.net/chenlycly/category_12458859.html
以多年的开发实战为基础,分享一些开源组件及数据库技术!
2、Qt 可以用来做什么?
经过 20 多年的发展,Qt已经成为最优秀的跨平台开发框架之一,在各行各业的项目开发中得到广泛应用。许多大型软件都是用 Qt 开发的,如 Autodesk Maya、Google Earth、Skype、WPS Ofice等。
Qt 可以开发支持Windows、Linux和macOS多平台的跨平台桌面应用软件,也可以开发iOS和Andriod移动平台的移动App,还可以用于嵌入式设备中的嵌入式应用软件的开发。
近年来,在国产化浪潮的推动下,国内的 Qt 使用者越来越多,Qt 开发也变得越来越火,招聘市场上对Qt开发人员的需求也越来越大,很多大公司的软件也在选择使用Qt开发。Qt在当前招聘市场上的火爆场面,是几年前所不曾有过的。
有些厂商为了实现对Windows和Linux双平台的支持,直接使用Qt做客户端软件开发,而不再选择Windows用Windows专用界面库开发、Linux用Qt开发的方式。比如视频监控大型厂商海康威视和大华的视频监控客户端软件、视频会议厂商厦门亿联的视频会议客户端软件,都是直接使用Qt开发的。此外,很多做人工智能公司也都在用Qt。
3、Qt 的由来与发展
3.1、Qt 的起源与发展
Qt的创始人是挪威人Haarard Nord(Trolltech公司的CEO)和Eirik Chambe-Eng(Trolltech公司的总裁),当时他们是一家瑞典公司的同事。1990年,他们在做一个项目,这个项目需要在Unix、Macintosh和Windows上运行同一个GUI界面,他们希望研发一个面向对象的跨平台通用GUI框架,他们取名为Qt。字母Q作为所有类的前缀,是因为Haarard手写这个字母看起来特别的漂亮,字母t代表工具包“toolkit”,是从“X toolkit”工具包的命名方式中获得的灵感。
1991年,Haavard和Eirik开始按照之前的设想,着手实现Qt跨平台框架,一起合作设计、编写最终成为Qt的那些类。在随后的一年中,Eirik提出了“信号和槽(signals/slots)”的设想,这是一个简单并且有效的强大的图像用户编程规范。而现在,他已经可以被多个工具包实现。Haavard实践了这一想法,并且据此创建了一个手写代码的实现系统。到1993年,Haavard和Eirik已经开发出了Qt的第一套图像内核程序,并且能够利用它实现他们自己的一些窗口部件。同年末,为了创建“世界上最好的C++图形用户界面框架”,Haavard提议一起进军商业领域。
1994年成为两位年轻程序员不幸的一年,他们没有客户,没有资金,只有一个未完成的产品,但他们希望能够闯进一个稳定的市场。幸运的是,他们的妻子都有工作并且愿意为她们的丈夫提供支持。在这两年里,Haavard和Eirik人为,他们需要继续开发产品并且从中赚取收益。他们于1994年3月4日成立奇趣科技公司,公司最初的名字还是“Quasar Technologies”,随后更名为“Troll Tech”,而公司今天的名字则是“Trolltech”。
1995年4月,通过Haavard就读过的大学的一位教授的介绍,挪威的Metis公司与他们签订了一份基于Qt进行软件开发的合同。大约在同一时间,公司雇用了Amt Gulbrandsen,在公司工作的六年时间里,他设计并实现了一套独具特色的文档系统,并且对Qt的代码也做了不少贡献。
1995年5月20日,Qt 0.9被上传到sunsite.unc.edu。6天后,在comp.os.linux.announce上发布。这是Qt第一个公开发行的版本。Qt既可以用于Windows上的程序开发,也可以用于UNIX上的程序开发,而且在这两种平台上,都提供了相同的应用程序编程接口。从第一天起,Qt就提供了两个版本的软件许可协议版本。一个是进行商业开发所需要的商业版本,一个是适用于开源开发的自由软件许可版本。Metis的合同确保了公司的发展,然而,在长达十个月的时间内,在没有任何人购买Qt的商业许可协议。
1996年3月,欧洲航天局(European Space Agency)购买了10分Qt的商用许可协议,他成了第二个Qt用户。凭着坚定的信念,EEirik和Haavard有雇佣了另外一名开发人员。Qt 0.97在同年5月底正式发布,随后在1996年9月24日,Qt1.0正式面世。到了这一年的年底,Qt已经发展到了1.1版本,共有来自8个国家的客户买了18分商用许可协议。也就在这一年,在Matthias Ettrich的带领下,创立了KDE项目。
1997年4月发布Qt 1.2。Matthias Ettrich利用Qt建立KDE的决定,使Qt成为Linux环境下开发C++图像用户界面的标准。Qt1.3于1997年9月发布。Matthias Ettrich在1998年加入公司,并且在当年9月,发布了Qt 1系列的最后一个版本——V1.4。1999年6月,Qt 2.0发布,该版本有有一个新的开源许可协议——Q公共许可协议(QPL,Q Public License),他与开源的定义一致。1999年8月,Qt赢得了LinuxWorld的最佳奖/工具奖。大约在这个时候,Trolltech Pty Ltd成立了。
2000年,公司发布了Qt/Embedded Linux,它用于Linux嵌入式设备。Qt/Embedded Linux提供了自己的窗口系统,并且可以作为X11的轻量级替代产品。现在,Qt/X11和Qt/Embedded Linux 除了提供商业许可协议之外,还提供了广为使用的GNU通用公共许可协议(GPL,General Public License)。
2000年底,成立了Trolltech Inc,并发布了Qtopia的第一版,他是一个用于移动电话和掌上电脑的环境平台。Qt/Embedded Linux在2001年和2002年两次获得了Linux World的“Best Embedded Linux Solution”奖,Qtopia Phone也是在2004年获得了同样的荣誉。
2001年,Qt 3.0发布。这个版本的Qt,已经可用于Windows、MacOS、NUIX、和Linux(桌面和嵌入式)等多个平台了。Qt 3 提供了42个新C++类,代码行数超过500000行。Qt3是自Qt2以来前进历程中最为重要的一步,他在诸多方面上都进行了优化和改进,包括本地化和统一字符编码标准的支持、全新的文本查看和编辑窗口部件,以及一个类似于Perl正则表达式的类等。2002年,Qt3赢得了Software Develpment Times 的“Jolt Productivity Award”(Jolt生产力奖 )。
2005年夏,Qt 4.0发布,该版本大约有500个类和9000多个函数,Qt4.0比以往的任何一个版本的都要全面和丰富,并且他已经裂变成多个函数库,开发人员可以根据自己的需要只引入Qt的部分库。相对于以前的Qt版本,Qt4 的进步是巨大的,它不仅彻底的对高效易用的模板容器、高级的模型/视图功能、快速而灵活的二维绘图框架和强大的统一字符编码标准的文本查看和编辑类进行了大量的改进,更不必说对那些贯穿整个Qt类中的成千上万个小的改良。现如今,Qt已经超越了作为GUI图形用户界面工具包的界限,逐渐成长为一个成熟的应用程序开发框架。Qt4 也是第一个能够在其所有可支持的平台上,既可以用于商业开发,又可以用于开源开发的Qt版本。
2005年,公司在北京开设了一家办事处,以便于中国及其销售区域内的用户提供服务和培训,并且为Qt/EmdeddedLinux 和 Qtopia提供技术支持。通过获取一些非官方的语言绑定件(language bindings),非C++程序员也可以使用Qt,特别适用于Python程序员的PyQt语言绑定件。
2007年,公司也发布了用于C#程序员的非官方语言绑定键Qyoto。同一年,QtJambi(基于JVM平台的Qt移植)投放市场,他的一个官方支持的Java版本Qt应用程序编程接口。自奇趣科技公司诞生以来,Qt的声望经久不衰,而且至今依旧持续高涨。取得这样的进步,说明了Qt的质量,而且也说明人们都非常喜欢应用它。在过去的十年中,Qt已经从一个只被少数专业人士所熟悉的“秘密”产品,发展到了如今遍及全世界拥有数以千计的客户以及数以万计的开源开发人员的产品。
3.2、Qt 发展经历的三家公司
Qt的发展历程中主要经历了Trolltech、Nokia和Digia三家公司,Qt先后在这三家公司的推动下取得了长足的发展与进步。
Qt是由挪威的Trolltech公司于1991年发布,最初,Qt是为X Window系统开发的一套C++类库,用于简化开发图形应用程序的过程。它最早的版本只支持Unix操作系统。随着时间的推移,Qt逐渐发展成为一个功能大的框架,支持多个平台,包括Windows、macOS、Linux和嵌入式系统等。
2008年,Nokia斥资 1.5 亿美元收购了Trolltech公司,并将Qt作为开发Symbian平台应用程序的主要工具。。这使得Qt在移动应用开发领域得到了广泛应用。然而,随着智能手机市场的变化,Nokia决定将Symbian平台转移到Windows Phone平台,并将Qt的发展重点转向桌面和嵌入式应用程序。为了增强Qt在跨平台软件研发方面的实力,将公司名称变更为Qt Software。
2009年5月11日,诺基亚Qt Software宣布Qt源代码管理系统面向公众开放。为了便于这些内容的管理,Qt Software启用了基于Git和Gitorious开源项目的Web源代码管理系统。
2011年,Nokia将Qt的开发和商业权益转让给了Digia公司。这一举措进一步推动了Q的发展,并为其开源社区带来了更多机会。Qt的开源版本称为Qt Community Edition,而商业版本则由Digia公司提供,并提供额外的支持和服务。
2012 年 8 月 9 日, Digia宣布以 400 万欧元的价格完成对诺基亚Qt业务及软件技术的全面收购,并计划将Qt应用到Android、IOS及Window8平台上。
2013年,Qt的发展回到了正轨。
2014年4月,跨平台的集成开发环境Qt Creator3.1.0发布,同年5月20日配发了Qt5.3正式版,至此Qt实现了对iOS、Android、WP等各平台的全面支持。
2014年9月,Digia成立了The Qt Company全资子公司,以进一步开发和拓展Qt技术。Digia的目标更是想成为桌面、嵌入式、移动开发者和公司的强大后盾,为他们提供最强大的跨平台UI和应用程序框架。
目前的Qt在不同的行业都取得了不小的成绩,比如在能源、医疗、军工和国防、汽车、游戏动画和视觉效果、芯片、消费电子、工业自动化、计算机辅助设计和制造等。
在国际上,Qt被使用到OPIE、Skype、Opera、VLC media player、Adobe Photoshop Elements、VirtualBox与Mathematica等产品中,Autodesk 、欧洲空间局、梦工厂、Google、HP、KDE、卢卡斯影业、西门子公司、富豪集团、华特迪士尼动画制作公司、三星集团、飞利浦、Panasonic 等国际知名公司都在使用Qt。
在国内,很多公司也在用QT,比如大家日常工作中常用的WPS(12以后的版本)、多玩的YY语音、咪咕音乐、优酷客户端、许多游戏对战客户端、海康和大华的视频监控客户端、厦门亿联的视频会议客户端等。大家工作中常用的抓包工具WireShark、音视频分析工具Elecard StreamEye Tools都是用Qt开发的。数年来,Qt就是这样从一个不知名的产品,发展到现在拥有全世界成千上万的客户。
4、为什么选择 Qt ?
Qt具有以下几个突出的特点:
1)Qt是基于 C++ 的一种语言扩展(Extention)
C/C++ 目前还是一种很多人都在学习的语言,Qt的好处就在于Qt本身可以被称作是一种 C++ 的延伸。Qt 的类都是用 C++ 实现的,是C++类。Qt 本身就继承了C++的快速、简易、面向对象、高效运行等优点。
2)Qt 具有非常好的可移植性(Portable)
Qt不只是运行在 Linux 平台上,也同样可以运行在 Microsoft Windows 、Mac OS X等多种不同的平台中。这也意味者,利用 Qt编写出来的应用程序,在几乎不用修改的情况下,就可以同时在多种平台上运行。Qt的应用非常之广泛,从 Linux到 Windows ,从 x86 到 Embedded 等都有大量Qt应用的成功范例。
3)Qt支持跨平台构建(Cross-Platform Builds)
编写用于多平台的软件是单调乏味的,且可能随时出现错误。维护编制文件更是如此,尤其是当不同的编译器和平台组合需要若干个编制文件时。通过qmake工具,Qt能够很好地面对这一挑战。这个工具可以为目标平台生成准确无误的编制文件。
4)Qt是开源软件(Open Source)
Qt产品提供的是采用双重授权的软件许可模式。在该双重授权模式下,Qt产品不仅可在获得商业许可下针对专利软件开发,而且还可以在GPL(通用公共许可证,版本2或版本3)下用于开发免费和开源软件。
5)Qt架构健壮,性能强大(powerful)
Qt 已由成千上万商业与开放源应用程序员,在多个操作系统与编译器上进行了测试,奠定了高性能应用程序的基础。此外,Qt运行时无需依赖“虚拟器”,模拟层或大容量的运行时间环境。它如本地化的应用程序一样,能够直接写入低级的图形函数,因而使用Qt开发的应用程序能以源代码速度执行。
6)Qt使用起来简便高效(concise)
Qt统一的跨平台API,让程序员们集中精力致力于可增值的技术革新,而无须担心维护和管理现有应用程序多版本的基础结构与界面。 因此Qt开发人员仅需要学会一种API来写入应用程序,该程序便可在任何地方运行。Qt Software投入了相当大的努力使得Qt使用起来尽可能简单和直观。来自世界各地的客户反馈普遍认为Qt编程简单而有趣;而对于商务应用而言,Qt可以转换为更多的功能,并且在保持质量性能的情况下,只需更少的维护工作。
5、Qt 支持的平台
使用Qt开发的软件,相同的代码可以在任何支持的平台上编译与运行,而不需要修改源代码。会自动依平台的不同,表现平台特有的图形界面风格。
Linux/X11:用于X Window System(如Solaris、AIX、HP-UX、Linux、BSD)。支持KDevelop和Eclipse IDE集成Mac:用于Apple Mac OS X。基于Cocoa框架。支持Universal Binary。支持以Xcode编辑、编译和测试。Windows:用于Microsoft Windows。支持Visual Studio集成,也可以使用MinGW编译。Embedded Linux:用于嵌入式Linux。可以通过编译移除不常使用的组件与功能。通过自己的视窗系统QWS,不需依赖X Window System,直接写入Linux帧缓冲。可以减少存储器消耗。并提供虚拟帧缓冲QVFb,方便在桌面系统上进行嵌入式测试。手机移动系统:Qt 支持主流的 Android、iOS、WinPhone 等手机操作系统,可以使用QT开发手机app应用程序。
6、Qt 的授权模式
Qt开放源代码,并且提供自由软件的用户协议,使得它可以被广泛地应用在各平台上的开放源代码软件开发中。Qt有商业版和开源版,商业版是付费的,如果购买的商业版的Qt,那么就可以得到Qt官方的售后、培训等相关服务。开源版本是免费的,而且与商业版在源码上基本一致,只是有些插件只发布在商业版。
Qt 产品的提供是采用双重授权的软件许可模式。在该双重授权模式下, Qt 产品可以在获得商业许可下针对专利软件开发,而且还可以在 GPL(通用公共许可证,版本 2 或版本 3)下用于开发免费和开源软件。 也就是说,Qt 这个软件本身是开源和免费使用的, 如果你基于GPL协议来开发软件的话,你开发的东西都要以 GPL 协议发布- 开源并免费提供源码。
自从 Qt4.5 版本发布以后,Qt 通过三种授权方式提供: 商业、LGPL 和 GPL,并且仍然符合 Qt 的双重授权战略,Qt 的授权方式的简要说明如下:
Qt 商业版 | Qt 商业授权适用于开发专属和/或商业软件。此版本适用于不希望与他人共享源代码,或者遵循 GNU 宽通用公共许可证 (LGPL) 2.1 版或 GNU GPL 3.0 版条款的开发人员。 |
---|---|
Qt GNU LGPL v. 2.1 | 此版本 Qt 适用于开发专属或开源 Qt 应用程序,前提条件是必须遵循 GNU LGPL 2.1 版的条款。 |
Qt GNU GPL v. 3.0 | 如果您希望将 Qt 应用程序与受 GNU 通用公共许可证 (GPL) 3.0 版本条款限制的软件一同使用,或 者您希望 Qt 应用程序遵循该 GNU 许可证版本的条款,则此版本 Qt 适用于开发此类 Qt 应用程 序。 |
授权方式在具体使用时的不同对比如下:
商业版 | LGPL 授权版 | GPL 授权版 | |
---|---|---|---|
授权收费 | 收取授权费 | 免费 | 免费 |
必须提供更改 Qt 的源代码 | 不需要, 更改的代码可以不公 布 | 必须提供源代码 | 必须提供源代码 |
可以创建专属应用程序 | 可以,不必公布源代码 | 可以,但必须遵循 LGPL v.2.1 条款 | 不可以,应用程序受 GPL 限 制,且源代码必须公开。 |
提供更新 | 是,仅限申请有效维护服务的 用户。 | 是,免费发布。 | 是,免费发布。 |
支持 | 提供,条件是维护协议必须有 效。 | 不提供,必须单独购买。 | 不提供,必须单独购买。 |
运行时收费 | 是 | 否 | 否 |
Qt开源版本能够开发商业应用吗?答案是可以的,但要遵循LGPL协议。LGPL协议是一个开源协议,它可以让开发者开发商业软件而不必开放源代码,当然这也是有前提条件的。LGPL协议中规定,如果你以动态链接库的形式开发应用程序,那么你可以以任何形式发布你的应用程序,商业或非商业、开源或闭源。如果你的应用程序中使用了静态链接,那么你必须在发布应用程序中包含使用到静态链接相关的源码。
幸运的是,使用Qt开源版本开发软件,对于一般的应用程序,以动态链接的形式足够满足开发需求,所以,在LGPL协议下,尽情地开发Qt程序吧,不必担心Qt软件版权和收费的问题。
7、Qt 版本的选择
Qt自从1991年诞生起,不断地发展迭代,历经的版本从Qt1、Qt2、Qt3、Qt4直到今天的Qt5、Qt6,每一代的产品都在以前的基础上进行了完善优化,其功能越来越强大,框架性能越来越优越,成为了当今最受欢迎的跨平台开发技术之一。
如今,Qt1、Qt2、Qt3已经几乎无人在用了,Qt4仍有不少人在用,Qt5是主流版本,用的人最多,也是Qt最成熟的一代产品。Qt6是最新发布的版本,优化了框架,提高了性能,但因为是最新技术,众多开发者还没有跟上时代的步伐,毕竟成熟的技术在短时间内不容易被替换。还有很重要的一点,Qt6必须在线安装,也就是必须联网,这对于没有网络的计算机或禁止联网的办公场所是很不友好的。
版本的选择上,查看了大量的版本特性。之前,Qter们普遍认为,最稳定的版本是Qt4.8系列,Qt4.8.7也被官方称为Qt4的终结版本。若是嵌入式类的应用,那Qt4.8系列是不二选择。
Qt5是Qt最新的大版本,对Qt4做出了重大的革新,有如下特性:
全面的模块化架构,结构清晰。
全新的基于OpenGl的图形引擎,全面提升QtQuick的界面性能。
全面支持C++11标准。
全新的支持操作系统统一框架,对新的操作系统具有更好的兼容性。
Qt5.0的正式版是2012.12发布的,初期由于各种原因,还存在着不少bug,随着一次次更新,它也在逐步修复和完善。当前的Qt5.0已经很成熟了,不过该大版本中使用了大量的C++11标准的新语法,较旧的编译器可能无法完全支持。比如VS2010只支持了部分的C++11新特性,直到VS2015才支持C++11的所有新特性。如果项目中使用的是VS2015之前的版本,可能就不能使用Qt5.0版本了,可以选择Qt4.8版本。
8、选择 QML 还是 Qt Widgets?
Qt主要是由C++编写,从Qt4.7引入了一项新技术:Qt Quick,其开发语言是Qt自创的QML。QML是一种标记语言,可以非常直观且高效地写出漂亮复杂的界面。QML主要用来弥补C++在移动端的不足,QML在移动端开发界面的表现远远优于Qt C++,这是QML主要的优势之一。但QML是为开发界面而设计的语言,其在处理数据、编写算法、硬件交互等方面又是远远不足,无法与C++相比,所以就有了QML与C++交互使用这项技术,使用QML编写前端界面,C++处理后端数据,取长补短。
Qt助手是这么描述它的,QML是一种用户界面规范和标记语言。允许开发人员和设计师创建高性能、流畅的动画和视觉吸引人的应用程序。
在QML出现之前,大家都在使用Qt 进行桌面应用的开发。在QML推出之后,大家又多了一个选择,但 在Qt界引发了Widgets和QML两大阵营的纷争,那就是,到底是选用qml好?还是Widgets好?
8.1、什么是 Widgets ?
Qt Widgets是一个模块,它提供了一组用于构建经典UI的用户界面(UI)元素。Widgets模块中包含了很多UI类,用于创建GUI应用程序的各种控件和窗口部件。其中一些主要的类包括:
QApplication:应用程序类,负责管理应用程序的控制流程和事件循环。QMainWindow:主窗口类,提供了一个应用程序的主界面。QWidget:窗口部件类,是所有用户界面元素的基类。QLabel:标签类,用于显示文本或图像。QPushButton:按钮类,用于触发事件。QLineEdit:单行文本框类,用于输入单行文本。QTextEdit:多行文本框类,用于输入和显示多行文本。QComboBox:下拉框类,用于选择列表中的一个选项。QSpinBox:微调框类,用于输入和显示数字。QCheckBox:复选框类,用于选择一个或多个选项。QRadioButton:单选框类,用于选择一个选项。QProgressBar:进度条类,用于显示任务的进度。QSlider:滑块类,用于调整数值。QTableWidget:表格类,用于显示和编辑表格数据。QTreeView:树形视图类,用于显示树形结构。QDockWidget:停靠窗口类,用于显示可停靠的窗口。
Widgets出现的很早,属于传统界面开发,和VB/VC/Delphi等拖曳控件开发类似,如下:
Widgets走CPU绘制,能最大化的兼容现有的硬件和过去的相对偏低性能的硬件。
8.2、什么是 QML ?
从Qt4.7引入了一项新技术:Qt Quick,其开发语言是Qt自创的QML。QML是一种描述性的脚本语言,文件格式以.qml结尾。语法格式非常像CSS(参考后文具体例子),但又支持javascript形式的编程控制。QML可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C++代码进行方便的交互,使用起来非常方便。
QML 是一种声明语言,用于描述程序界面。QML 文档描述了一个对象树。QML 元素包含了其构造块、图形元素(矩形、图片等)和行为(例如动画、切换等)。这些 QML 元素按照一定的嵌套关系构成复杂的组件,供用户交互。QML 将用户界面分解成一块块小的元素,每一元素都由很多组件构成。QML 定义了用户界面元素的外观和行为;更复杂的逻辑则可以结合 JavaScript 脚本实现。这有点类似于 HTML 和 JavaScript 的关系,前者用来显示界面,后者用来定义行为。
Qt Quick 就是使用 QML 构建的一套类库。一个 QML 文档分为 import 和对象声明两部分。如果你要使用 Qt Quick,就需要在QML文件中导入QtQuick 2类库:
import QtQuick 2.0
QML 属于新时代的产物,大概从2010年开始,和flutter/Electron等web开发框架及移动开发框架类似,为了适应各种移动端开发及动画流畅性触摸丝滑体验、充分利用和“榨干”现在的GPU性能,把CPU留出来给用户最大化发挥。
目前国内Widgets多于QML,国外可能偏向QML,这个不难看出,流行的移动端开发框架都是国外开发者居多。
8.3、Widgets 与 QML 工程的创建以及各自的描述文件
Qt Creator 可以创建多种项目,在最左侧的列表框中单击“Application”,中间的列表框中列出了可以创建的应用程序的模板,各类应用程序如下:
Qt Widgets Application,支持桌面平台的有图形用户界面 (Graphic User Interface,GUI)界面的应用程序。GUI 的设计完全基于 C++语言,采用 Qt 提供的一套 C++类库。Qt Console Application,控制台应用程序,无 GUI界面,一般用于学习 C/C++语言,只需要简单的输入输出操作时可创建此类项目。Qt Quick Application,创建可部署的 Qt Quick 2 应用程序。Qt Quick 是 Qt 支持的一套GUI开发架构,其界面设计采用 OML 语言,程序架构采用 C++语言。利用 Qt Quick可以设计非常炫的用户界面,一般用于移动设备或嵌入式设备上无边框的应用程序的设计。Qt Quick Controls 2 Application,创建基于 Qt Quick Controls 2 组件的可部署的 Ot Quick 2应用程序。Qt Quick Controls 2 组件只有 Qt 5.7 及以后版本才有。Qt Canvas 3DApplication,创建 Qt Canvas 3D QML 项目,也是基于OML语言的界面设计支持 3D 画布。
如果创建的是Widgets应用程序,则选择“Qt Widgets Application”类型;如果创建的是QML应用程序,则选择“Qt Quick Application ”类型,如下所示:
Widgets的界面描述文件以.ui结尾,如下所示:
QML的界面描述文件是以.qml结尾,如下所示:
.ui文件和.qml文件,它们的语法、开发模型、设计工具和性能特点等方面有所不同,如下:
1)语法:.ui文件使用XML格式来描述用户界面,其中包含了界面组件的布局、属性和信号与槽的连接。而QML使用一种基于JavaScript的声明性语言来描述用户界面,通过使用QML的语法和组件来构建界面和定义其行为。
2)开发模型:.ui文件是基于Qt Widgets的开发模型,它主要用于构建传统的桌面应用程序。Widgets提供了丰富的预定义组件,并且使用C++进行逻辑和业务处理。而QML是基于Qt Quick的开发模型,它更注重于创建现代化、交互友好的界面,并提供可嵌入到C++代码中的模块化组件。
3)设计工具:.ui文件通常使用Qt Designer来进行可视化编辑和设计。Qt Designer提供了可视化的界面构建工具,使开发人员可以直观地拖放和配置界面组件。而QML通常使用Qt Creator或其他文本编辑器进行编辑,开发人员需要手动编写QML(QT标记语言QML)代码来描述界面的结构、外观和行为。当然,也可以借助Qt Creator拖放和配置界面组件。
4)跨平台支持:.ui文件基于Qt Widgets,可以在各种平台上运行,包括桌面、移动和嵌入式系统。而QML也是基于Qt的,因此也具备很好的跨平台支持,能够轻松地在不同平台上运行。
5)性能:由于.ui文件是基于Widgets的,Widgets通常比QML在性能方面更高效。特别是对于复杂的界面和大量数据的处理,Widgets可能更具优势。但是,QML的渲染性能相对更好,适用于高度动态和交互的用户界面。
8.4、Widgets 和 QML 的比较
Widgets和QML是两种不同的用户界面开发技术,各自有其优势和适用场景。Widgets更适合传统的桌面应用程序开发,对于较复杂的界面和交互需求,以及对细粒度控制更重要的场景,Widgets可能更有优势。QML适用于需要快速迭代、设计驱动和跨平台支持的应用程序。
下面是Widgets和QML之间的一些比较:
1)语法和表达能力:QML使用声明性的语法,允许开发人员使用更简洁、直观的方式来描述用户界面的结构和行为。QML具备良好的可读性和可维护性,可以更快地实现迭代和修改。Widgets使用的是JavaFX中的Java代码,它基于继承和组合,需要更多的代码来实现界面功能和交互。
2)集成和复用:QML可以方便地与C++代码集成,使用Qt的信号和槽机制实现QML控件/组件与C++对象之间的交互。同时,QML组件的复用性也更好,可以通过不同的组件和模块来构建和组合复杂的界面。Widgets在集成和复用方面相对有限,主要依赖于Java代码的组织和继承结构。
3)设计和原型开发:QML提供了简洁的语法和实时预览功能,使得界面的设计和原型开发更加便捷。设计师可以迅速创建和修改界面的外观和交互效果,从而实现快速的界面迭代。Widgets在这方面相对较弱,原型开发可能需要更多的代码和重复的构建过程。
4)跨平台支持:QML是Qt框架的一部分,而Qt是一个跨平台的开发框架。因此,使用QML可以方便地创建并在不同平台上运行应用程序,包括桌面、移动和嵌入式系统。Widgets原生支持桌面平台,但在移动和嵌入式平台上的支持相对较弱。
8.5、如何选择 Widgets 和 QML ?
在选择QML和Widgets之间的Qt技术时,需要综合考虑项目需求、开发团队技能和经验、设计工作流程、跨平台需求和性能要求等因素。有时候也可以考虑两者的结合使用,根据具体场景选择最适合的技术来开发用户界面。
在选择QML和Widgets时,可以考虑以下几个因素:
1)项目需求:首先要考虑项目的需求和目标。如果项目需要现代化、交互友好的用户界面,以及快速迭代和设计驱动的开发方式,那么选择QML可能更合适。如果项目需要细粒度的控制、复杂的界面和对传统桌面应用的支持,那么Widgets可能更合适。
2)开发团队技能和经验:考虑开发团队成员的技能和经验对选型也非常重要。如果团队更熟悉和擅长于使用QML和Web前端技术,那么选择QML可能更有优势。如果团队更善于使用C++和传统的桌面应用开发方式,那么Widgets可能更适合。
3)设计工作流程:考虑设计团队的工作流程和设计需求。如果设计师需要频繁地修改和迭代界面设计,并且愿意直接参与到界面开发中,那么QML的可视化设计工具和实时预览功能可能更适合。而如果设计师更习惯使用设计工具来创建界面原型,而不直接参与到代码开发中,那么Widgets可能更适合。
4)跨平台需求:如果项目需要支持多个平台,包括桌面、移动和嵌入式系统,那么QML作为Qt框架的一部分,具备更好的跨平台支持。Widgets原生支持桌面平台,对于移动和嵌入式平台的支持相对较弱。
5)性能要求:在一些对性能要求较高的场景下,Widgets可能更具优势。Widgets是基于C++的,对于复杂的界面和大量数据的处理,Widgets相对更高效。
9、Qt 开发环境搭建
Qt应用程序的开发环境是可以选择的。可以将相关的Qt版本与构建工具集成到Visual Studio中,用Visual Studio开发,这对长期使用VS开发的工程师来说,是非常友好的。也可以用Qt自家的IDE工具Qt Creator,这款IDE本身就是用Qt开发的。
要使一个Qt应用程序跑起来,仅仅一个Qt Creator是不够的,还需要安装调试器、编译器和Qt版本。这边给出几个工具的下载链接。
Qt版本:Index of /official_releases/qt
Qt Creator:Index of /official_releases/qtcreator
Microsoft Visual C++ Compiler:下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux
上面的Qt版本实际上是一个套件包,里面包含了不同平台Qt版本和调试器。安装完QT之后,再去安装Qt Creator。
初次打开Qt Creator,新建一个项目,Qt Creator会提示你选择套件:
那么,我们按照所需进行配置,我所用的是C和C++编译器都是msvc14,qt版本与之对应,调试器就选套件包里自带的gdb for minGW,全部配置完,apply之后,ok即可。然后应用注意不要选错或者选成平台不支持的,可能会导致编译不通过,或者可以通过,但是UI的效果与预期的有偏差。
10、Qt 程序发布
Qt程序开发完成后,就需要打包和发布出去,需要将主程序文件和其依赖的多个Qt dll库打包到安装程序中。
最开始打包的Qt dll库可能不完整、有缺失,然后根据运行时缺失库的提示,然后找到dll库一个个打包到安装包程序中。但将程序安装到其他电脑中后,发现还是缺失不少dll库,所以我们需要规范的Qt程序发布方法。
以Windows上的Qt程序发布为例,Qt开源社区介绍,下载的Qt官方开发环境中会自带一个发布工具windeployqt.exe。从名字中不难看出,这个工具,就是找寻Windows下Qt的依赖库的。使用方法也很简单,打开cmd,将windeployqt.exe的路径输入,空格,不加任何参数,将你所需要打包的Qt程序路径输入,运行即可。
运行过程中,它会将该Qt程序所依赖的平台相关库和Qt核心库打包放置到Qt程序的目录下。需要注意的是,它不会将你程序依赖的第三方库拷进目录,其它的库需要自己手动拷进目录。Qt依赖的库还是很多的,打包的时候选择release版本,会使依赖库相对小很多,必要的时候还可以删除一些不需要的库。
11、GUI 应用程序UI界面库介绍
最后,再介绍一下开发C++开发桌面应用软件常用的一些界面库。使用C++开发GUI用户界面应用程序,目前主要集中在两个平台,一个Windows平台,一个Linux平台。Windows平台开发GUI程序,可以使用的UI界面库较多,有微软的MFC、开源的duilib、Chrome浏览器UI组件以及跨平台的Qt库。Linux平台,则主要使用Qt库开发。
11.1、MFC
对于微软MFC库,界面粗糙且美化实现比较麻烦,现在商业软件基本不用MFC了,但一些股票证券类的软件还在使用MFC(这类软件对界面效果没有太高的要求)。不过使用MFC去写一些小的工具还是比较方便的,通过简单的控件拖拽就能快速地搭建一个完整的工具界面。
11.2、duilib
duilib库是基于directui思想实现的UI界面库,相对于MFC,要好用很多,可以较容易地去实现一些酷炫的界面效果。很多知名的公司都在使用该库,比如ZOOM视频会议客户端、PC版微信、爱奇艺PPS客户端、京东咚咚客户端、百度网盘客户端、酷我音乐、酷狗音乐、华为PC版手机助手等。有些中小型公司也在使用该界面库,比如2345公司的好压等产品。
网易和腾讯都开源了各自基于duilib改进而来的界面库,原生的duilib我们使用过,但腾讯和网易的开源版本没有研究过,不知道效果如何,不知道相对于原生的duilib都做了哪些改进。回头有时间的时候可以去研究一下
11.3、Qt
Qt是一套支持跨平台的界面库,既支持Windows平台,也支持Linux平台,甚至支持移动平台。如果要开发Linux系统中的客户端软件,则需要使用Qt界面。当前主流的国产操作系统有中标麒麟、银河麒麟和通信UOS,这些系统均是基于Linux系统打造的。随着国产化系统的推行与普及,很多软件既要支持在Windows上运行,也要支持在国产化Linux桌面系统上运行。
近年来,在国产化浪潮的推动下,Qt的支持者和使用者越来越多,Qt开发也变得越来越火,招聘市场上对Qt开发人员的需求也越来越大,很多大公司的软件也在选择使用Qt开发。Qt在当前招聘市场上的火爆场面,是几年前不曾有过的。
有些厂商为了实现对Windows和Linux双平台的支持,直接使用Qt界面开发,而不再选择Windows用Windows专用界面库开发、Linux用Qt开发的方式。比如视频监控大型厂商海康威视和大华的视频监控客户端软件都直接采用Qt界面库开发。很多做人工智能公司也都在用Qt。
11.4、Chromium UI组件
Chromium是Google的一个久负盛名的浏览器C++开源项目,它是Google的Chrome浏览器背后的引擎(几乎包含了Chrome浏览器的所有实现代码),其目的是为了创建一个安全、稳定和快速的通用浏览器。
Chromium的设计思想基于简单、高速、稳定、安全等理念,在架构上使用了Apple发展出来的WebKit渲染引擎,并采用Google独家开发出的用于提升JavaScript解译效率的V8引擎,以提升JavaScript的效率,而且设计了“沙盒”、“黑名单”、“无痕浏览”等功能,来实现稳定与安全的网页浏览环境。
很多浏览器使用的都是Chromium开源内核,比如微软Win10系统中推出的Edge浏览器抛弃了IE内核,转而使用Chromium内核。国内知名的360浏览器、QQ浏览器、傲游浏览器,它们用的都是Chromium内核,只是开发了各自的UI皮肤和界面,增加了一些额外的用户功能。接下来说到的CEF嵌入式浏览器框架也是基于Chromium内核实现的。
除了浏览器使用到了开源Chromium的内核,很多Windows应用软件也使用到了Chromium中的内容,使用到了Chromium中的UI组件。比如字节的飞书客户端、阿里的钉钉客户端、华为的WeLink客户端、网易云音乐与有道云笔记,均使用到了Chromium中的UI组件。