Qt简介
Qt(官方发音 [kju:t],音同 cute)是一个跨平台的C++开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。
Qt 是纯 C++ 开发的,所以学好 C++ 非常有必要,对于不了解 C++ 的读者,我建议先阅读《C语言教程》,再阅读《C++教程》。C++ 是在C语言的基础上发展起来的,学完C语言就学了 C++ 的一半了。
Qt 还存在Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。开源社区就是这样,好东西就会被派生扩展,到处使用, 越来越壮大。
Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。
Qt 作为一套跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。API丰富、IDE易用、跨平台、优异的图形视图框架、文档齐全等均是其特点。详细的 Qt 介绍可以点击跳转查看。
Qt Creator作为一个上手非常容易的IDE,也同样值得称道,当年VS 2017发布时号称宇宙第一IDE,我们戏称Qt Creator为宇宙第二,我们用惯Qt Creator后基本抛弃了VS。Qt Creator包括项目生成向导、高级的 C++ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等。
Qt的对手们
较为常见的Windows UI框架
MFC:微软发布的C++ Windows 框架,主要是对Win API进行了封装。
Winform / WPF:微软发布的UI框架,.NET。WPF为取代Winform的产品。
常见的跨平台应用程序框架
Electron / NW.js :NodeJS相关,使用Web技术(HTML、CSS、JS)开发桌面应用,极大的方便了前端人员的工作。
CEF:基于Google Chromium项目的开源Web browser控件,支持Win、Mac、Linux,完善H5 Web开发,可集成C++。一般使用Web技术开发UI,C++做底层,可通过修改编译选项和源代码后编译的方式定制自己的窗口。
Flutter:基于Dart语言的UI框架,目前主要用于移动端开发,跨全平台只是时间问题。一套代码即完美适用桌面端、移动端还是比较吸引人的。关于Flutter未来的表现,可以前往查看此文。
wxWidgets:开源跨平台C++框架,使用比较广泛,与Qt类似。完全使用LGPL协议具备一定的优势。
GTK+:开源GUI工具包,但以C实现面向对象存在一定的劣势。
本文仅对与Qt功能类似的框架做了罗列,并不会在此进行对比和讨论,且该系列文章只是将以往的经验与心得写出,给后来学习Qt的人做个参考。如若您对各种框架有兴趣了解更详细的内容,可自行搜索。若希望进行探讨,可留言。
Qt的优缺点
Qt优缺点都会比较有代表性,下面进行罗列。
一般的优点:丰富的API、最为面向对象、支持2D/3D图形渲染、支持OpenGL、开发文档量大且齐全、支持XML、架构健壮且性能不错、支持平台更多等特点;
一般的缺点:使用非标准C++、庞大且臃肿、性能表现不是特别优秀等。
以上罗列的是一些抽象的且普遍被人提及的一些优缺点,但涉及一些具体的特点或者不为人知的、需要实践得来的点一般都不会在百科类型文章中提及,你可以在下面小编总结的文字中咀嚼一二,如有不当之处欢迎留言指导与讨论。
Qt优势之处
优良的跨平台特性:只要不涉及系统级别的功能实现,一般情况下Qt的跨平台表现良好,修改率很低。小编工作中经常需要操作Windows底层功能,导致产品一直未能做到跨平台。
开发效率高:此开发效率是相对总体而言,在C++类型的框架中,Qt的应用程序开发效率绝对算高的,当然与Web开发方式相比还是有些劣势。基础UI开发部分有QWidget方式、布局管理与qss效果实现,快速UI开发如Quick与QML,特别之处如信号槽的机制,同时配合Qt Creator这个合适的IDE,这些都对开发效率有明显提升。如若在嵌入式平台,采用Qt开发绝对可以是首选。
强大的图形视图框架:此处不是指Qt widgets的内容,是Graphics View Framework。一般的UI开发性能差异不明显,当有成千上万个Item以及涉及超大场景的功能设计时,图形视图框架仍然可以应对自如。文档说可以包含数百万个Item,曾经做过测试,确实所言非虚。
Qt劣势之处
信号槽的效率问题:信号槽的性能问题一般情况下较难感知,但在延时敏感的功能中,如需要计算时间戳、或涉及听觉视觉的功能,过多的信号槽可以带来明显的延时,此种情况中,采用回调方式更可取。
效率的问题主要是Qt信号槽机制涉及函数查找及参数传递,其中包含了链表操作、事件处理以及线程中锁部分的处理。一般情况下,信号槽与回调的效率有10倍之差,情况复杂时即远不止10倍。
Qt的UI绘制、事件传递、网络模块等功能,都非常依赖信号槽机制,这也同时意味着Qt的运行效率如果深究起来,可能算不得优异。但由于是C++框架,性能终归不属于太差。
网络模块的性能问题:Qt network模块性能差强人意,前文提到了信号槽机制的影响,此外并发和数据传输性能均较低,这与Qt底层机制与架构有关。使用Qt网络模块开发小型功能没问题,大型系统可选用其他库,毕竟C++相关的网络库非常多。
Qt Widgets 性能问题:前文提到了信号槽的问题,由于Qt widgets中涉及大量的绘图、事件等的信号传递,这是对效率的一大影响;此外Qt widgets图像渲染都是自绘,不存在硬件加速,如若场景变的复杂,性能会有明显的影响。
虽然Quick与QML可以支持硬件加速,支持OpenGL,图形渲染性能也非常强悍,但Quick和QML存在硬件兼容的问题。我们开发产品过程中,曾经做了Qt4迁移到Qt5的尝试,希望能更多的利用Quick2的强大特性与功能,没曾想Quick2在HD Graphics3000显卡或低级别显卡中不能运行,程序打开即崩溃或白屏,也尝试过自行编译Qt源码使用不同的选项参数,但未能解决此问题,至此产品再没有使用过Quick2的功能。
哪些APP用了Qt?
由于本人未接触过很多用了Qt的APP,下面仅将小编接触过的进行罗列,以供初学者能初步了解Qt的应用有哪些,说不定有感于应用之广泛能更加坚定学习的决心,同时对于了解Qt的人来说也可以随意看看。若想了解详细的清单,可自行查看Qt项目清单 、Github中的Qt项目。
著名的
剑网3
Opera
YY
WPS
Maya:专业3D相关软件
Google Earth
Skype
小众的
LMMS:开源音频工作站
MuseScore:开源打谱软件
FreeCAD
Qt 适合做哪些事
理论上来说,Qt可以做能想到的任意APP,因为Qt大且全。但做产品需要考虑开发难度、使用性能、运行效率等问题,这样Qt就会排除调很多开发方向。
嵌入式APP:这个方向当仁不让
桌面客户端:如果开发一般客户端,Qt没问题。但涉及到系统级别的功能,如触屏、系统事件处理等,最好的方式还是采用原生API或其他框架结合开发。图形动画方面,Qt property animation和QML animation相结合,可以做出非常多好看的动画。
网络应用:小型C/S网络系统的开发,完全采用Qt模块没问题。若需要开发较大型的网络应用,最好是使用Qt与其他库或框架相结合的方式。
多媒体系统:Qt多媒体模块比较依赖系统库,如音视频解码就依赖系统解码库。但对于开发一般的多媒体系统,Qt还是可以从容应对,Audio Multimedia模块的功能还比较完善。但对于开发高级多媒体功能,还是需要借助其他库或框架,比如常见的FFmpeg、PA、ASIO等。
为什么还要用Qt/C++
前段时间接触了NodeJS/electron和Python开发桌面应用,甚至包括跨平台大热的Flutter,对于各个框架、语言间的区别稍有所体会,每个社区和论坛中对于语言框架对比优劣经常是吵的翻天覆地,在此并不想鼓吹孰优孰劣,仅仅是想为有志学习Qt的同志们或Qt的普及提供多一些的素材和经验之谈。
依稀记得在某篇文章中,作者比较偏向Electron类型的跨平台解决方案,更希望能只通过前端技术走天下。诚然现今NodeJS大火,以及Web技术中轮子的丰富性无可比拟,通过Web技术进行开发,效率甩其他开发方式老远,技术丰富性迭代更新更加快速,社区和解决方案也非常完善。那Qt/C++存在的意义又是什么呢?
首先我们需要明白一点,技术选型是一种权衡,并不是只有唯一解,不能一概而论说哪个更好!作为软件技术人员,现在很少有一种技术走到黑的人,我们终究要在不断学习新技术以及尝试新方法的道路上一直走下去的。
嵌入式应用
开发嵌入式类型应用时,Qt作为首选项无可替代,此种情况也不需要做讨论。
桌面应用
业务流程类型的应用,其实使用何种语言、框架并无差别,这种产品的开发讲究快和稳。Qt在这里可以用,但并不具备优势。
性能要求较高的应用,Qt/C++作为偏向native的技术类型,自然是更具备性能的优势的。其他框架如Electron之类的框架,是没办法满足这些条件。
功能复杂的专业应用,使用native类型开发,应用体验会更好。明显的例子比如微信客户端和网页版。
相对来说,Qt在跨平台桌面应用开发上是一个为数不多的好选择,相比较wxWidgets之类的方案,Qt更加成熟且易用,同时也具备相当多的优点和缺点。Electron之类的方案属于是前端的延伸,由于前端的天生优点,导致开发效率和轮子都比较有优势,但开发桌面应用同样具备较大的劣势。综合来说,由于C++性能较好的特性,且Qt可以与其他C++库或框架结合开发,使用Qt/C++来开发桌面应用是一个相对合适的选择。
移动端
Qt开发移动端其实是有问题的,曾经想将产品直接迁移至安卓版,过程中坑太多。但是如果移动端的功能简单,是可以尝试使用Qt的。