Qt VS MFC,谁才是你的最爱?(上)

转帖|对比评测|编辑:龚雪|2016-04-06 09:16:35.000|阅读 649 次

概述:MFC(微软基础类库)是专门为windows设计的一个用于开发图形用户界面的类库;Qt可以运行在Windows、Mac OSX、Unix、还有像Sharp Zaurus这类嵌入式系统中,Qt是完全面向对象的。

相关链接:

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

Qt这个C++的图形库由Trolltech在1994年左右开发。它可以运行在Windows、Mac OSX、Unix、还有像Sharp Zaurus这类嵌入式系统中,Qt是完全面向对象的。Document/View modelMFC编程需要使用Document/View模式以及模板(template),如果不使用的话,编程将变得异常困难。而且模板(template)设定了固定的结构,若所需结构乃模板未定义的结构,则编程难。例如,划分一区域使显示两个视图(view)于两个文档(document)。还有一个经常的问题是:模板(template)创建了视图(view)却无法访问(access)它,文档(document)要做完所有事情,但是这经常会出现问题。 这种数据和视图分开的设计模式也是一种不错的模式,不应该成为否定MFC的理由。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充满了丈二和尚摸不着头脑的事情,并且,这种错误很难调试。 诚然MFC是为了封装Window API,用MFC比Winows API会简单些,但确实有些函数的调用时机、先后顺序,如果不是用过一段时间,确实可能因此导致问题。

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控制。

本文转载自qimo601.iteye.com
PS:相关产品下载请点击查看>>
Telerik UI联合慧都科技全场让利!全线7.5折!点击查看详情>>


标签:BCGUI界面C/C++

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果

文章转载自:慧都控件网

登录 慧都网发表评论


慧都网友 2016-04-06 10:07:36.000
0

这二者是针对不同的平台,现在的跨平台开发Qt确实是不错的选择!


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
title
相关厂商
相关产品
BCGControlBar Professional Edition for MFC

用于构建类似微软Office、VS等MFC用户界面高级套包。

Qt Enterprise

Qt是一个跨平台的C++图形用户界面应用程序开发框架。

在线
客服
在线
QQ
电话
咨询
400-700-1020
购物车 反馈 返回
顶部
在线客服系统
live chat