轉(zhuǎn)帖|對(duì)比評(píng)測(cè)|編輯:龔雪|2016-04-06 09:16:35.000|閱讀 1137 次
概述:MFC(微軟基礎(chǔ)類(lèi)庫(kù))是專(zhuān)門(mén)為windows設(shè)計(jì)的一個(gè)用于開(kāi)發(fā)圖形用戶(hù)界面的類(lèi)庫(kù);Qt可以運(yùn)行在Windows、Mac OSX、Unix、還有像Sharp Zaurus這類(lèi)嵌入式系統(tǒng)中,Qt是完全面向?qū)ο蟮摹?/p>
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
MFC(微軟基礎(chǔ)類(lèi)庫(kù))是專(zhuān)門(mén)為windows設(shè)計(jì)的一個(gè)用于開(kāi)發(fā)圖形用戶(hù)界面的類(lèi)庫(kù)。MFC或多或少使用了面向?qū)ο蟮姆椒òb了Win32的API,正因如此,這些API有時(shí)是C++,有時(shí)是C,甚至是C和C++的混合體。
Qt這個(gè)C++的圖形庫(kù)由Trolltech在1994年左右開(kāi)發(fā)。它可以運(yùn)行在Windows、Mac OSX、Unix、還有像Sharp Zaurus這類(lèi)嵌入式系統(tǒng)中,Qt是完全面向?qū)ο蟮摹ocument/View modelMFC編程需要使用Document/View模式以及模板(template),如果不使用的話(huà),編程將變得異常困難。而且模板(template)設(shè)定了固定的結(jié)構(gòu),若所需結(jié)構(gòu)乃模板未定義的結(jié)構(gòu),則編程難。例如,劃分一區(qū)域使顯示兩個(gè)視圖(view)于兩個(gè)文檔(document)。還有一個(gè)經(jīng)常的問(wèn)題是:模板(template)創(chuàng)建了視圖(view)卻無(wú)法訪(fǎng)問(wèn)(access)它,文檔(document)要做完所有事情,但是這經(jīng)常會(huì)出現(xiàn)問(wèn)題。 這種數(shù)據(jù)和視圖分開(kāi)的設(shè)計(jì)模式也是一種不錯(cuò)的模式,不應(yīng)該成為否定MFC的理由。Qt不強(qiáng)制使用任何設(shè)計(jì)模式,如果你認(rèn)為恰當(dāng),使用Document/view沒(méi)有任何問(wèn)題,不使用也沒(méi)有任何問(wèn)題。
歸根結(jié)底,Qt和MFC的差異在于其設(shè)計(jì)的差異。MFC的根本目的是訪(fǎng)問(wèn)包裝起來(lái)的用C語(yǔ)言寫(xiě)的windows的API,這絕非好的面向?qū)ο?的設(shè)計(jì)模式。在很多地方,你必須提供一個(gè)包含15個(gè)成員的C語(yǔ)言的struct,但是其中只有一個(gè)與你所期望的相關(guān),或者必須用舊式的參數(shù)來(lái)調(diào)用你的函數(shù)。MFC還有許多讓人摸不著頭腦的地方,函數(shù)名沒(méi)有任何的連續(xù)性。比如,如果你創(chuàng)建了一個(gè)graphical類(lèi),直到調(diào)用了creat()以后該類(lèi)才會(huì)被創(chuàng)建。然而對(duì)dialogs,必須要等到OnInitDialog()才能創(chuàng)建這個(gè)對(duì)象。奇怪的是到了views,創(chuàng)建該類(lèi)的函數(shù)名竟然成了OnInitUpdate()!你自己創(chuàng)建一個(gè)類(lèi)并用他們的方式調(diào)用它,然后程序崩潰了。
比如說(shuō)有一個(gè)dialog包含CEdit控件,如果沒(méi)有調(diào)用DoModal()你就不能使用GetWindowText(),否則將會(huì)莫名其妙的失敗。總之,MFC充滿(mǎn)了丈二和尚摸不著頭腦的事情,并且,這種錯(cuò)誤很難調(diào)試。 誠(chéng)然MFC是為了封裝Window API,用MFC比Winows API會(huì)簡(jiǎn)單些,但確實(shí)有些函數(shù)的調(diào)用時(shí)機(jī)、先后順序,如果不是用過(guò)一段時(shí)間,確實(shí)可能因此導(dǎo)致問(wèn)題。
Qt恰恰相反,它的架構(gòu)明顯是經(jīng)過(guò)精心設(shè)計(jì)的面向?qū)ο蟮摹t因此在命名、繼承、類(lèi)的組織等方面保持了優(yōu)秀的一致性。你只需要提供唯一一個(gè)方法的參數(shù),僅此一個(gè)。在不同的類(lèi)中調(diào)用方式也是有很強(qiáng)的連貫性,返回值也很有邏輯性。所有一切達(dá)到了簡(jiǎn)單和強(qiáng)大的和諧統(tǒng)一。一旦你使用了其中一個(gè)類(lèi),其他的類(lèi)也就觸類(lèi)旁通,因?yàn)樗麄兪且恢碌摹T赒t中可以利用Edit控件,用C++創(chuàng)建類(lèi)的方法來(lái)創(chuàng)建自己的QLineEdit。永遠(yuǎn)可以馬上訪(fǎng)問(wèn)任何的方法,不管它是顯示還是隱藏。在這里沒(méi)有迷局,一切都按照你認(rèn)為的簡(jiǎn)單的方式來(lái)運(yùn)作。
MFC是事件驅(qū)動(dòng)的架構(gòu),要執(zhí)行任何操作,都必須是對(duì)特定的消息作出響應(yīng)。Windows對(duì)應(yīng)用程序發(fā)送的信息數(shù)以千計(jì),遺憾的是,要分清楚這些分繁蕪雜的消息是很困難的,并且關(guān)于這方面的文檔并不能很好的解決這些問(wèn)題。
Qt的消息機(jī)制是建立在SIGNAL()發(fā)送和SLOT()接受的基礎(chǔ)上的,這個(gè)機(jī)制是對(duì)象間建立聯(lián)系的核心機(jī)制。利用SIGNAL()可以傳遞任何的參數(shù)。它的功能非常的強(qiáng)大,可以直接傳遞信號(hào)給SLOT(),因此可以清楚的理解要發(fā)生的事情。一個(gè)類(lèi)所發(fā)送信號(hào)的數(shù)量通常非常的小(4或者5),并且文檔也非常的齊全,這讓你感覺(jué)到一切盡在掌握之中。SIGNAL/SLOT機(jī)制類(lèi)似于Java中l(wèi)istener機(jī)制,不過(guò)這種機(jī)制更加輕量級(jí)、功能更齊全。
MFC無(wú)法創(chuàng)建大小動(dòng)態(tài)可變的子窗口 ,必須重新手動(dòng)修改代碼來(lái)改變窗口的位置(這恰好解釋了為什么windows里的dialog是不可以改變的),這個(gè)問(wèn)題在軟件進(jìn)行國(guó)際化翻譯的時(shí)候更加嚴(yán)重,因?yàn)樵S多國(guó)家表達(dá)相同意思需要更長(zhǎng)的詞匯和句子,必須要對(duì)每個(gè)語(yǔ)言的版本重新修改自己的軟件。
在Qt中,任何東西都可以手動(dòng)的敲出來(lái),因?yàn)樗芎?jiǎn)單。為了得到一個(gè)button,可以這樣寫(xiě):button = new PushButton( "buttonName", MyParentName );如果想在按下某個(gè)按鈕以后調(diào)用某斷代碼的執(zhí)行,可以這樣寫(xiě):connect( button, SIGNAL( clicked() ), qApp, SLOT( action() ) );Qt擁有非常簡(jiǎn)單而又不失強(qiáng)大的layout機(jī)制,以至于不使用它就是在浪費(fèi)時(shí)間了。
Qt還提供了一個(gè)圖形用戶(hù)工具:Qt Designer,它可以用來(lái)幫助建立用戶(hù)界面、可以修改所使用的任何控件的屬性。不用將它們放在嚴(yán)格的位置,就可以通過(guò)layout完美的組織他們。這個(gè)工具所產(chǎn)生的代碼是可以實(shí)際閱讀并理解的,生成的代碼單獨(dú)放在一個(gè)文件里,在編程的同時(shí),你可以隨心所欲的多次重新生成用戶(hù)界面。
Qt Designer可以讓你完成許多在MFC中不可能完成的任務(wù),比如用預(yù)先填好的生成listview、在每個(gè)tab上用不同的view來(lái)使用tab控制。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都控件網(wǎng)