当前位置:首页 > 机械智慧 > 正文

推荐一本好书,Qt和MFC的比较

1.Qt概述1.1.Qt简介Qt是一个1991年由HaavardNord和EirikChambe-Eng开发的跨平台C++图形用户界面应用程序开发框架。发展至今,它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt同Linux上的Motif,Openwin,GTK等图形界面...

1.Qt概述1.1.Qt简介Qt是一个1991年由HaavardNord和EirikChambe-Eng开发的跨平台C++图形用户界面应用程序开发框架。发展至今,它既可以开发GUI程序,也可用于开发非......

1.Qt概述1.1.Qt简介

Qt是一个1991年由HaavardNord和EirikChambe-Eng开发的跨平台C++图形用户界面应用程序开发框架。发展至今,它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt同Linux上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西。但它对比其他做界面的软件会比较容易使用和学习。

Qt是一个跨平台的C++应用程序框架,支持Windows、Linux、MacOSX、Android、iOS、WindowsPhone、嵌入式系统等。也就是说,Qt可以同时支持桌面应用程序开发、嵌入式开发和移动开发,覆盖了现有的所有主流平台。你只需要编写一次代码,发布到不同平台前重新编译即可。

Qt不仅仅是一个GUI库,它除了可以创建漂亮的界面,还有很多其他组件,例如,你不再需要研究STL,不再需要C++的头文件,不再需要去找解析XML、连接数据库、Socket的各种第三方库,这些Qt都已经内置了。

Qt是应用程序开发的一站式解决方案!Qt虽然庞大,封装较深,但它的速度并不慢,虽不及MFC,但比Java、C大家都不介意了)

(3)应用范围

现在windows的普及范围谁能比过,所以MFC的客户量比较多,QT主要是Linux下的开发人员在使用,但MFC也只是得益于windows(感觉又是一次捆绑战略),MFC不支持嵌入式开发(主要指手机平台),但是QT有对应的模块,虽然这一手机开发领域被Java碾压,但总归是有的。

(4)学习难度

QT的封装哲学比较明晰,和系统隔离的比较好,所以个人感觉门槛不高。MFC较难精通,因为深入开发之后SDK还是要了解的,否则程序感觉比较儿童化。

(5)伪对象vs真对象

归根结底,Qt和MFC的差异在于其设计的差异。MFC的根本目的是访问包装起来的用C语言写的windows的API。这绝非好的面向对象的设计模式,在很多地方,你必须提供一个包含15个成员的C语言的struct,但是其中只有一个与你所期望的相关,或者必须用旧式的参数来调用你的函数。MFC还有许多让人摸不着头脑的地方,函数名没有任何的连续性。比如,如果你创建了一个graphical类,直到调用了creat()以后该类才会被创建。然而对dialogs,必须要等到OnInitDialog()才能创建这个对象。奇怪的是到了views,创建该类的函数名竟然成了OnInitUpdate(),你自己创建一个类用他们的方式调用它,你的程序崩溃了。

(6)消息循环

MFC是事件驱动的架构。要执行任何操作,都必须是对特定的消息作出响应。Windows对应用程序发送的

信息数以千计,遗憾的是,要分清楚这些分繁芜杂的消息是很困难的,并且关于这方面的文档并不能很好的解决这些问题。

Qt的消息机制是建立在SIGNAL()发送和SLOT()接受的基础上的。这个机制是对象间建立联系的核心机制。利用SIGNAL()可以传递任何的参数。他的功能非常的强大。可以直接大传递信号给SLOT(),因此可以清楚的理解要发生的事情。一个类所发送的信号的数量通常非常的小(4或者5),并且文档也非常的齐全。这让你感觉到一切尽在掌握之中。SIGNAL/SLOT机制类似于Java中listener机制,不过这种机制更加轻量级,功能更齐全。(这种机制确实貌似简单清晰了一些)

(7)创建界面

MFC无法创建大小动态可变的子窗口,必须重新手动修改代码来改变窗口的位置(这恰好解释了为什么windows里的dialog是不可以改变的)这个问题在软件进行国际化翻译的时候更加严重,因为许多国家表达相同意思需要更长的词汇和句子,必须要对每个语言的版本重新修改自己的软件。

在Qt中,任何东西都可以手动的敲出来,因为它很简单:为了得到一个button,可以这样些button=newPushButton("buttonName",MyParentName);如果想在按下某个按钮以后想调用某断代码的执行,可以这样写:connect(button,SIGNAL(clicked()),qApp,SLOT(action()));Qt拥有非常简单而又不失强大的layout机制,以至于不使用它就是在浪费时间了。

Qt还提供了一个图形用户工具,QtDesigner,可以用来帮助建立用户界面。可以修改所使用的任何控件的属性。不用将他们放在严格的位置,可以通过layout完美的组织他们。

这个工具所产生的代码我们是可以实际上阅读并且可以理解的。生成的代码单独放在一个文件里,在编程的同时,你可以随心所欲的多次重新生成用户界面。

QtDesigner可以让你完成许多在MFC中不可能完成的任务,比如用预先填好的生成listview,在每个tab上用不同的view来使用tab控制。(界面方面Qt确实很好很强大)

(8)帮助文档

用户选择图形开发环境的时候,帮助文档是否周全是左右其选择的重要因素。Visual的开发环境的帮助文档MSDN(这个还要单独掏钱购买)非常的庞大,有10个CDROM光盘。他包罗万象,涵盖广泛。但是难免有泥沙俱下,主题模糊,关键信息不突出的遗憾。其链接设计的也很糟糕,通过链接很难从一个类跳转到其父类或者子类以及相关的类。如果你搜索一个关键字,不管是VisualC++,VisualJ++,VisualBasic,只要包含这些关键字的信息统统的返回来。

Qt的文档设计的相当优秀。你可以到。Qt的文档完备且详细的覆盖了Qt的方方面面,竟然仅有18M。每一个类和方法都被详尽描述,巨细靡遗,举例充实。通过Trolltech公司提供的链接或者是QtAssistant工具,可以方便的从一个类或者方法跳转到其他的类。文档还包含了一个初学者教程和一些典型应用的例子。同时还提供了FAQ和邮件列表,方便通过Internet或者用户群来查阅。如果你购买了授权,在一天之内你将会得到Trolltech公司的技术支持。实际上,Qt优秀的帮助文档使得寻求外部帮助的机会大大减少。Tolltech公司的一个宗旨是:有如此优秀的Qt产品以及其帮助文档,技术支持是多余的。

MSDN用熟了很好用,很全面,相关的背景知识,例子都能找到。而且网上还有丰富的例程可以参考。仅凭Qt的帮助文档绝对不足以解决所有问题,而网上我只找了个Qt中文论坛,提过几个问题,有的给出了解决办法,有的也没人回答,还要靠自己试。

(9)Unicode

使用MFC,如果要显示unicode,在编译链接的时候必须用到特殊的参数(和改变可执行文件执行的入口),必须在每个string前面加上T,将char修改成TCHAR,每个字符串处理函数(strcpy(),strdup(),strcat())都要改变成另外的函数名。更令人恼火的是支持Unicode的软件竟然不能和不支持Unicode的DLL一起工作。这是个很严重的问题,但是你毫无选择。

使用Qt,字符串用QString来处理,其本身是与生俱来的Unicode.不需要改变什么东西。不要在编译/链接时候增添参数,不要修改代码,只需要使用QString就可以了。QSting类功能强大,你可以广泛的使用它,并且不要担心Unicode问题。这使得转换为Unicode非常的方便。QSting提供了转换为char*和UTF8的函数。显然,MFC的CString的设计相比于Qt的QString设计有着巨大的不同。CString以char*为基础提供了很少的功能。它的优点是当需要char*类型的时候,可以直接使用CString类型。乍看起来这个好像是个优点,其实实质上还是有很大的缺陷的,特别是可以直接修改char*而不要更新类。在转变为Unicode的时候这个也碰到很大的麻烦。(CString随编译选项可以是Unicode版)相反,QString在内部以unicode存储string,需要时提供char*功能。实际上很少用到char*,因为整个Qt的API用文本的方式响应QString参数。QString还附带许多其他的功能,比如自动分享QString的内容。这是一个非常强大的类,你会喜欢在很多地方用它的。

(10)国际化

使用MFC是可以国际化的,但是需要将每一个字符串放在一个字符串表中,在代码中到处使用LoadString(IDENTIFIET)。然后转化这些资源到DLL中,翻译字符串到所需要的语言,改变图形界面,然后调用程序使用这个DLL。整个过程是如此的繁琐,可谓牵一发而动全身。考虑的事情要面面俱到。

使用Qt的时候,只需要将字符串置于函数tr()中,在程序开发中这算是举手之劳。可以直接在代码中改变字符串的参考。QtLinguist,Qt的一个工具,能够提取所有待翻译的string并按照友好的界面显示出来。这个用户界面非常适合翻译,使用字典,显示字符串内容,恰当的unicode显示,快捷方式冲突检测,检测未翻译的字符串,检测字符串修改情况,功能齐全。这个软件可以供没有任何编程经验的翻译者使用。同时该软件在GPL的版权下发布,可以按照你的需求来修改它。翻译以后的文档保存在XML中,适合软件复用的原则。为软件增加一种新的语言版本仅仅是用QtLinguist产生一个新的文件而已。(这点Qt做的很不错。)

(11)resources问题

使用MFC,一部分开发过程要依靠“resources”,在很多的案例中开发者必须使用他们。这样会导致如下的后果:出了VisualStudio,你很难使用其他的工具来完成开发。资源编辑器仅有有限的功能,比如:通过Dialog编辑器不可能改变所有的属性,一些属性可以改变,另一些属性则不可能改变。(译者注:下面还有两条陈述MFC缺点的实例,但我感觉这些已经够说明问题了,暂时删节不译)

然而Qt并没有资源的概念,这就解决了以上所提到的问题。Qt提供了一个脚本使得能将编入你的代码。对于界面设计,QtDesigner则创建了可读的代码。(QtDesigner设计界面很不错)

(12)价格

一旦你购买了VisualStudio,你将免费的获得MFCSDK。Qt在Unix上是可以免费获得其遵守GPL版权的版本(现在在windows上也可以免费获得其GPL版本)。如果要开发不公开源代码的软件,必须购买Qt的授权。在特定平台下,每个开发者购买一个永久性授权,并获得一年的技术支持。

(13)发布

在发布基于MFC的软件时,必须依靠存在于客户电脑上的MFC。但是这是不安全的,同样是,可以基于相同的库得到3个不同的版本。通常,需要检查是否拥有正确的版本,如果不是,就升级它。但是升级会改变很多软件的行为。这让我感到很不舒服,如果用户在安装我的软件以后导致其机器死机该怎么办?

Qt则没有这个风险,因为Qt压根就没有“升级整个系统”这个概念。(如果不是一个版本的Qt,还是会有问题的)

1.5.Qt的主要应用领域

Qt是使用的语言是C++,所以C++能做的领域,Qt都适合。而且Qt还支持手机开发,所以Qt的应用场合非常广。qt常见的应用领域有军工软件行业(在国内这是第一大应用领域)、游戏(比如极品飞车)、服务端开发、数字图像处理、虚拟现实仿真(比如Google地球)、嵌入式系统的界面、跨平台开发等等。

总而言之,学好C++和Qt,走遍天下都不怕。下面列举了Qt成功开发的著名软件。

3DSlicer,afreeopensourcesoftwareforvisualizationandmedicalimagecomputing

AcetoneISO:镜像文件挂载软件

AdobePhotoshopAlbum,一个图像组织应用程序[35]

Arora:一款跨平台的开源网页浏览器

AutodeskMotionBuilder,三维角色动画软件

AutodeskMaya,3D建模和动画软件

Avidemux,aFreeSoftwareprogramdesignedformulti-purposevideoeditingandprocessing

Avogadro:高级分子编辑器

:暴雪公司开发的游戏对战平台

BOUML,一个免费的统一建模语言工具箱

Bitcoin:比特币

chmcreator:开源的chm开发工具

CineFX:一款跨平台、开源、免费、影片剪辑,特效与合成套装

CoCoA,asoftwareforcomputationsincommutativealgebra

DashExpress,anInternet-enabledpersonalnavigationdevice

DAZStudio,a3Dfigureillustration/animationapplication

Doxygen:API文件产生器

EAGLE,toolfordesigningprintedcircuitboards(PCBs)

EiskaltDC++,aprogramthatusestheDirectConnectprotocol.

Emergent:神经网络模拟器。

,asoftwareproductforthesimulationofelectromagneticfields

eva:Linux版QQ聊天软件。

FreeCAD,afreeandopensource3D-SolidandgeneralpurposedesignCAD/CAE

FreeMat:一个自由开源的数值计算环境和编程语言

FullTiltPoker,oneofthemostpopularonlinepokerprograms

Gadu-Gadu:实时通信软件

Gambas,AfreedevelopmentenvironmentbasedonaBasicinterpreter

GoldenDict:一款开源的字典软件

Google地球(GoogleEarth):三维虚拟地图软件。

GNS:Cisco网络模拟器。

GuitarPro6,atablatureeditor

刺猬大作战:一个基于百战天虫的开源游戏。

Hydrogen,anadvanceddrummachine

ImageVis3D,avolumeray-castingapplication

Ipe:自由的矢量图形编辑器

ISEWebpack,afreewareEDAtoolforWindowsandLinuxdevelopedbyXilinx

Kadu,aPolishinstantmessengerusingtheGadu-Gaduprotocol

KDELibs:一个许多KDE程序都使用的共享库,如Amarok、K3b、KDevelop、KOffice等。

KeePassX,amulti-platformportofKeePass,anopensourcepasswordmanagerforMicrosoftWindows

Launchy:一个开放源代码的快捷启动器

LMMS:一个开放源代码的音乐编辑软件

LyX:使用Qt作为界面的LaTeX软件。

Mathematica:Linux和Windows版本使用Qt作为GUI

MaxwellRer,asoftwarepackagethataidsintheproductionofphotorealisticimagesfromcomputer3Dmodeldata

Mixxx:跨平台的开放源代码DJ混音软件

MuseScore,一个WYSIWYG的乐谱编辑器

Nuke,anode-basedcompositor

PDFedit:自由的PDF编辑器

PokerTH,anopensourceTexashold'emsimulator

Psi:一款XMPP网络协定的实时通信软件

qBittorrent:自由的BitTorrentP2P客户端

QCad:一个用于二维设计及绘图的CAD软件

Qjackctl,atoolforcontrollingtheJACKAudioConnectionKit

QSvn,aGUISubversionclientforLinux,UNIX,MacOSXandWindows

Opera:著名的网页浏览器。

QtCreator,thefreesoftwarecross-platformintegrateddevelopmentenvironmentfromNokia

Qterm:跨平台的BBS软件。

QuantumGIS:自由的桌面GIS

QuasselIRC:跨平台的IRC客户端

RealFlow,afluidanddynamicssimulatorforthe3Dindustry

Recoll:桌面搜索工具

Rosegarden,afreesoftwaredigitalaudioworkstationprogram

SciDAVis,across-platformplottinganddataanalysisprogram

Scribus:桌面排版软件。

Skype:一个使用人数众多的基于P2P的VOIP聊天软件。

SMPlayer:跨平台多媒体播放器

Spotify,musicstreamingservice.

Stellarium:一款天文学的自由软件

TeamSpeak:跨平台的音效通信软件

Texmaker:一款跨平台的开放源代码LaTeX编辑器

TeXworks,ItisagraphicaluserinterfacetothetypesettingsystemTeX.

TOra,adatabaseadministrationtool[36]

UniversalIndentGUI,anapplicationwhichhelpstheusertobeautify,reformatorindentvariouskindsofcode.

Valknut,aprogramthatusestheDirectConnectprotocol

VirtualBox:虚拟机软件。

VisIt:一个开源型交互式并行可视化与图形分析工具,用于查看科学数据。

VisTrails,ascientificworkflowmanagementandvisualizationsystem

VLC多媒体播放器:一个体积小巧、功能强大的开源媒体播放器。

VoxOx,aunifiedcommunicationssoftware.

WordPress,basedonQtforMaemoandSymbian

wpasupplicant,

Xconfig:Linux的Kernel配置工具

咪咕音乐:咪咕音乐是中国移动倾力打造的正版音乐播放器

WPSOffice:金山软件公司推出的办公软件

极品飞车:韩国Gameloft游戏公司出品的著名赛车类游戏

1.6.Qt的版本

Qt可以分为商业版和免费版。商业版又分为专业版和企业版。Qt免费版是Qt的非商业版本,开源。可以免费下载,但要基于GPLv3协议使用。

对于我们学习者来说,当然是使用免费版了。

当前,Qt的最新版是5.12LTS(长期支持版本),于2018年12月6日正式发布。这是一个长期支持版本(LTS),官方将提供为期三年的支持。自上一个LTS版本发布以来,官方一致专注于提升软件质量,修复了2000多个bug,若从算起已经修复了5000多个bug。当然这只是个开始,在即将到来的补丁中,官方将持续提升的质量。

和其他主要版本一样,也包含了许多新特性。下面让我们聊聊其中的几个亮点。

(1)新的模块和平台

Qt现在完全支持QtforPython,让Python开发者可以使用各种QtAPI。目前,您可测试其技术预览版,正式版本将在之后不久发布。QtforPython源自我们多年来一直在上托管的PySide项目。QtforPython把大多数QtC++的API开放给Python开发者使用。简而言之:Python开发者现在也可以创建复杂的图形化应用程序和用户界面。Python开发者的福音啊。

学过MFC开发的朋友知道,MFC可以生成ActiveX控件,然后可以放到网页中使用。Qt目前也有这样的功能,包含QtforWebAssembly的第二个技术预览版。使用QtforWebAssembly,您可以编译Qt应用程序,并可在任何现代Web浏览器中运行。虽然QtforWebAssembly仍被标记为技术预览版,但它的功能非常强大。貌似,现在开发工具不支持网页插件都不好意思出来混,可以看出,Qt在努力的追赶着MFC。

除了支持Python和WebAssembly这两个新平台之外,还完全支持了两个原来的技术预览模块:

QtRemoteObjects使Qt进程之间的通信变得天衣无缝。它允许将QObject的属性,信号和槽暴露给另一个进程,且这两个进程可以运行在不同设备上。

QtWebGLStreamingPlugin是另一个现在完全支持的插件。此插件允许您通过网络将应用程序的用户界面流式传输到任何现代浏览器。

(2)QtQML和QtQuick

在新版本中,我们对QML中的JavaScript引擎进行了一些重大改进。它从兼容ECMAScript5升级到现在完全支持ECMAScript7。现在可以使用最新的JavaScript了,同时也方便了第三方JavaScript库的集成。现在还支持ECMAScript模块,可以从C++和QML/JS加载。

我们已经在QtQuick中添加了另一种ItemView,即TableView。它比之前QQC1中的实现更高效,并填补了我们View控件中最后一个重要空白。QtQuickControls2中的许多控件还扩充了新方法和新功能。

的PointerHandlers现在改名为InputHandlers,它已经正式发布,并成为QtQuick中的重要功能。InputHandlers模块简化了复杂触摸交互的设计,过去使用MouseArea或TouchArea模块做复杂交互时非常困难。另外,我们还添加了两个新的InputHandlers用于悬停和拖动项目。

QtQuick现在支持预生成的distancefieldtextures。这些纹理包含在字形(glyph)中,并用于在QtQuick中渲染文本,在编译时预生成它们有助于提高应用程序启动性能,尤其是在低端嵌入式设备上。

(3)QtCore和QtNetwork

QtCore获得了对CBOR(简明二进制对象表示)的支持,这是一种类似于JSON的二进制格式,但它允许更多的数据类型和灵活性。

新颁布的Qt改进了QRegularExpression以支持通配符匹配,我们现在可以弃用旧的QRegExp类了。

在QtNetwork中,我们添加了DTLSoverUDP的支持。在macOS和iOS上,我们现在通过TransportSecurity后端,可以支持ALPN和HTTP/2,并且我们在通用SSL后端中添加了PKCS#8支持。

(4)QtGui和Widgets

在Windows上,Qt现在支持WindowsUI自动化,允许基于Qt的UWP应用程序与各种可用的可编程的UI控件工具进行交互。Qt使用统一的WindowsPointerInputMessages(在Windows8或更高版本中支持)替换了平板电脑、触摸屏、触摸板或鼠标中的输入实现。现在新增一些硬件的支持,如MSSurface系列中的screigitizer,而不再需要定制的驱动。

新版本Qt为QGradient添加了许多预定义的渐变(参考)。QImage支持RGBA64图像格式,每个颜色通道16位。这些信息可以从PNG或TIFF的文件中读取,并上传到OpenGL或从OpenGL中获取。

最后,新版本Qt还修复了QtWidgets中的大量bug。

(5)其它更新

Virtualkeyboard现在支持13种额外的键盘布局以及MyScript手写识别功能。它现在带有一个公共扩展API,允许您定义自己的布局。

QtLocation现在包含一个升级的MapBox插件和几个小的API增强功能。我们已将QtWebEngine升级到Chromium69,并获得对客户端证书的支持。

QtforAutomation现在更新了新版的KNX和MQTT模块,他们支持最新版本的协议。并且作为技术预览版本,我们添加了对OPC/UA的支持。

另外,即将推出的也将基于。

最后,还附带了新版本的。

总而言之,值得你学习和拥有!

最新文章