QT和MFC比较

在网上看到的,拿来和你们一块儿讨论下。文中不会逐条的列举Qt和MFC各自的优缺点。

我在使用MFC以前就已经使用Qt这个事实可能影响了个人客观性。编程

(MFC效率较高,但大量的Windows API和消息机制使得其较难理解,不易用;QT封装较好,易用且跨平台,但效率较低)

文章从实用主义的观点出发:个人老板给我一份软件的规划说明,而且让我来开发。其中一些我用Qt来开发,而另一些我使用MFC来开发。

MFC(微软基础类库)是专门为windows设计的一个用于开发图形用户界面的类库。MFC或多或少使用了面向对象的方法包装了Win32的API,正因如此,这些API有时是C++,有时是C,甚至是C和C++的混合体。

Qt这个C++的图形库由Trolltech在1994年左右开发。它能够运行在Windows,Mac OS X, Unix,还有像Sharp Zaurus这类嵌入式系统中。Qt是彻底面向对象的。

Document/View model
MFC编程须要使用Document/View模式以及模板(template),若是不使用的话,编程将变得异常困难。并且,模板(template) 设定了固定的结构,若所需结构乃模板未定义之结构,则编程难已。例如,划分一区域使显示两个视图(view)于两个文档(document)。还有一个经 常的问题是:模板(template)建立了视图(view)却没法访问(access)它,文档(document)要作完全部事情,可是这常常会出现 问题。

Qt不强制使用任何设计模式。若是你认为恰当,使用Document/view没有任何问题。不使用也没有任何问题。

伪对象 vs 真对象
归根结底,Qt和MFC的差别在于其设计的差别。

MFC的根本目的是访问包装起来的用C语言写的windows的API。 这绝非好的面向对象的设计模式,在不少地方,你必须提供一个包含15个成员的C语言的struct,可是其中只有一个与你所指望的相关,或者必须用旧式的参数来调用你的函数。

MFC还有许多让人摸不着头脑的地方,函数名没有任何的连续性。好比,若是你建立了一个graphical类,直到调用了creat()之后该类才会被创 建。然而对dialogs,必需要等到OnInitDialog()才能建立这个对象。奇怪的是到了views,建立该类的函数名居然成了 OnInitUpdate(),......你本身建立一个类用他们的方式调用它,你的程序崩溃了。

好比说有一个dialog包含CEdit控件,若是没有调用DoModal()你就不能使用GetWindowText()。不然将会莫名其妙的失败。总之,MFC充满了丈二和尚摸不着头脑的事情,而且,这种错误很难调试。

Qt偏偏相反,它的架构明显是通过精心设计的面向对象的。Qt所以在命名,继承,类的组织等方面保持了优秀的一致性。你只须要提供惟一一个方法的参数,仅 此一个。在不一样的类中调用方式也是有很强的连贯性。返回值也颇有逻辑性。全部一切达到了简单和强大的和谐统一。一旦你使用了其中一个类,其余的类也就触类 旁通,由于他们是一致的。

在Qt中能够利用Edit控件,用C++建立类的方法来建立本身的QLineEdit。永远能够立刻访问任何的方法,无论它是显示仍是隐藏。在这里没有迷局,一切都按照你认为的简单的方式来运做。

消息循环
MFC是事件驱动的架构。要执行任何操做,都必须是对特定的消息做出响应。Windows对应用程序发送的
信息数以千计,遗憾的是,要分清楚这些分繁芜杂的消息是很困难的,而且关于这方面的文档并不能很好的解决这些问题。

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

建立界面
MFC没法建立大小动态可变的子窗口,必须从新手动修改代码来改变窗口的位置(这刚好解释了为何windows里的dialog是不能够改变的)这个问 题在软件进行国际化翻译的时候更加严重,由于许多国家表达相赞成思须要更长的词汇和句子,必需要对每一个语言的版本从新修改本身的软件。

在Qt中,任何东西均可以手动的敲出来,由于它很简单:为了获得一个button,能够这样些

button = new PushButton( "buttonName", MyParentName );

若是想在按下某个按钮之后想调用某断代码的执行,能够这样写:

connect( button, SIGNAL( clicked() ), qApp, SLOT( action() ) );

Qt拥有很是简单而又不失强大的layout机制,以致于不使用它就是在浪费时间了。

Qt还提供了一个图形用户工具,Qt Designer,能够用来帮助创建用户界面。能够修改所使用的任何控件的属性。不用将他们放在严格的位置,能够经过layout完美的组织他们。这个工 具所产生的代码咱们是能够实际上阅读而且能够理解的。生成的代码单独放在一个文件里,在编程的同时,你能够为所欲为的屡次从新生成用户界面。

Qt Designer可让你完成许多在MFC中不可能完成的任务,好比用预先填好的生成listview,在每一个tab上用不一样的view来使用tab 控制。

帮助文档
用户选择图形开发环境的时候,帮助文档是否周全是左右其选择的重要因素。Visual的开发环境的帮助文档MSDN(这个还要单独掏钱购买)很是的庞大, 有10个CDROM光盘。他一应俱全,涵盖普遍。可是不免有泥沙俱下,主题模糊,关键信息不突出的遗憾。其连接设计的也很糟糕,经过连接很难从一个类跳转 到其父类或者子类以及相关的类。若是你搜索一个关键字,无论是Visual C++, Visual J++, Visual Basic,只要包含这些关键字的信息通通的返回来。

Qt的文档设计的至关优秀。你能够到doc.tolltech.com上面一睹芳容。

Qt的文档完备且详细的覆盖了Qt的方方面面,居然仅有18M。每个类和方法都被详尽描述,巨细靡遗,举例充实。经过Trolltech公司提供的连接 或者是Qt Assistant工具,能够方便的从一个类或者方法跳转到其余的类。文档还包含了一个初学者教程和一些典型应用的例子。同时还提供了FAQ和邮件列表, 方便经过Internet或者用户群来查阅。若是你购买了受权,在一天以内你将会获得Trolltech公司的技术支持。

实际上,Qt优秀的帮助文档使得寻求外部帮助的机会大大减小。Tolltech公司的一个宗旨是:有如此优秀的Qt产品以及其帮助文档,技术支持是多余的。

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

使用Qt,字符串用QString来处理,其自己是与生俱来的Unicode.不须要改变什么东西。不要在编译/连接时候增添参数,不要修改代码,只须要使用QString就能够了。

QSting类功能强大,你能够普遍的使用它,而且不要担忧Unicode问题。这使得转换为Unicode很是的方便。QSting提供了转换为char * 和UTF8的函数。

显然,MFC的CString的设计相比于Qt的QString设计有着巨大的不一样。CString以char *为基础提供了不多的功能。它的优势是当须要char *类型的时候,能够直接使用CString类型。乍看起来这个好像是个优势,其实实质上仍是有很大的缺陷的,特别是能够直接修改char * 而不要更新类。在转变为Unicode的时候这个也碰到很大的麻烦。

相反,QString在内部以unicode存储string,须要时提供char *功能。实际上不多用到char *,由于整个Qt的API用文本的方式响应QString参数。QString还附带许多其余的功能,好比自动分享QString的内容。这是一个很是强 大的类,你会喜欢在不少地方用它的。

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

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

resources问题
使用MFC,一部分开发过程要依靠“resources”,在不少的案例中开发者必须使用他们。这样会致使以下的后果:

出了Visual Studio,你很难使用其余的工具来完成开发。
资源编辑器仅有有限的功能,好比:经过Dialog编辑器不可能改变全部的属性,一些属性能够改变,另外一些属性则不可能改变。(译者注:下面还有两条陈述MFC缺点的实例,但我感受这些已经够说明问题了,暂时删节不译)
然而Qt并无资源的概念,这就解决了以上所提到的问题。Qt提供了一个脚本使得能将编入你的代码。对于界面设计,Qt Designer则建立了可读的代码。

价格
一旦你购买了Visual Studio,你将免费的得到MFC SDK。

Qt在Unix上是能够免费得到其遵照GPL版权的版本(译者注:如今在windows 上也能够免费得到其GPL版本)。若是要开发不公开源代码的软件,必须购买Qt的受权。在特定平台下,每一个开发者购买一个永久性受权,并得到一年的技术支 持。(译者注:后面关于购买价格等问题删去,由于价格不固定,若是有疑问请到官方网站查询价格)

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

Qt则没有这个风险,由于Qt压根就没有“升级整个系统”这个概念。

感受MFC相比QT的确有不少的不足,但MFC的用户群巨大。Qt要想短期撼动MFC的地位,仍是有点难度的windows

相关文章
相关标签/搜索