本文是在wxWidgets Wiki上面找到的一篇,對比了wxWidgets和其他一些界面工具的特點。看到很多朋友在網上詢問這些庫各自的特點,我想先把這篇文章翻譯出來——畢竟這也算是一篇官方的文章,應該比較有說服力吧!這篇文章寫于2004年左右,但是很明顯某些地方已經更新了,因為Qt 4.5是2009年才釋出的!
這是我第一篇翻譯,哪裡翻譯不好敬請諒解!
==================================================
首先是關于wxWidgets的一些基礎知識:
● wxWidgets是一個完整的GUI工具庫,提供了很多工具類;
● 有很多文檔(雖然一些隻是文檔片段);
● 免費供個人使用或者商業使用;
● 隻要可能,wxWidgets就會使用本地平台的SDK。也就是說,同一段代碼,在Windows下編譯将具有Windows程式的外觀,在Linux下編譯将具有Linux程式的外觀;
○ 這樣做的優點是,wxWidgets程式看上去和本地程式差不多,有時也會有一些本地元件的行為——例如在OS X上所有的文本域(text area)都将獲得内建的拼寫檢查的能力;
○ 這樣做的缺點是,wxWidgets程式在不同平台的行為可能會不一緻;那些使用輕量級元件的GUI庫或許會丢失一些特定平台的特性,但會将平台相關的代碼減到最少(是以,這樣做也能夠将不同平台元件的行為差異降到最小,并且減少了特定平台的bugs)。另外,由于使用本地感官風格,使得wxWidgets不适合于那些希望具有不同于系統界面風格的程式的開發。
下面是wxWidgets與不同的GUI庫之間的對比。
Qt
● Qt 4.5 在Windows、Mac和GNU/Linux下具有兩個協定:一個是對開源和商業軟體的LGPL協定,以及為那些認為從法律角度來說認為LGPL不安全的人們使用的商業協定。而所有的wxWidgets版本則是在經過修改的LGPL協定(這個協定已經通過了OSI的認可)下釋出的,允許免費開發和釋出所有的應用程式(豆子:是以Qt那個曾經令人頗有微詞的許可問題已經不複存在);
● Qt沒有wxWidgets所擁有的真正的本地化界面。我們的意思是,Qt在各個平台上自己繪制元件,使用自己的繪制技術将其模拟得很逼真。雖然Qt在Mac OS X,Windows XP 和 Vista上使用本地API實作元件的界面風格,但是事件處理、結果回調以及元件布局都是由Qt本身實作的;
● wxUniversal的實作同Qt類似;
● 需要注意的是,在KDE和嵌入式Linux平台上,Qt就是本地GUI庫;
● Qt被很多大型項目使用,如KDE和Opera浏覽器(另一方面,wxWidgets也被用于AOL Communicator之類的項目);
● Qt極大限度地使用了虛函數(Qt所有元件的基類QWidget包含至少51個虛函數),這比wxWidgets更加面向對象(相比而言,wxWidgets更多的使用了類似于MFC的宏)。這意味着,使用Qt你的代碼行數将少一些,但是wxWidgets的執行速度将快一些(這取決于你向誰去問這個問題);
● Qt被IBM和Borland Kylix(已經停止更新)使用,這意味着更加可靠。但是,有傳言說wxWidgets将被應用于下一版本的C++BuilderX;
● Qt在GNU/Linux上一套完整的包含幀緩沖(framebuffer)嵌入式GUI(Qt for Embedded Linux),使得你能夠非常容易的使用。這意味着一旦你有了帶有/dev/fb的Linux,你就可以在幾分鐘内準備好。Qt for Embedded Linux 同X11相比隻有很小的差别;
● 你可以使用基于Qt實作一個wxWidgets,同樣,wxWidgets通過使用wxGTK和GTK-Qt也能模拟Qt。
FLTK
● wxWidgets更加面向對象;
● FLTK實際上有更多細緻不同的元件類型,隻要比較一下在FLUID和wxDesigner或者DialogEdit中你所能做的就知道了。我曾經嘗試将一個FLTK應用程式一直到wxWidgets上,僅模拟那些按鈕就花費了相當多的時間;
● FLTK使用的修改後的LGPL協定比wxWidgets的協定更加嚴格,雖然它也提供了靜态連結的不同情況;
FOX
● FOX更加輕量級,而wxWidgets則是全功能的;
● wxWidgets有一個完整的API,而FOX僅僅關注于GUI特性;
● 類似于Qt,FOX在每個平台繪制出其元件,而不是使用本地元件;相比之下,wxWidgets使用的是本地API。是以,FOX可能更快一些,但是它提供的界面可能不能很好的融入目标平台(例如,不能應用Windows XP的主題風格);
● FOX缺少列印支援,但是支援亞洲文字的I18N(它内部使用UTF-8編碼)(豆子:這段原句是FOX lacks printing and I18N support for asian language (it's using UTF-8 internally). ,但原文的意思是缺乏I18N的,可後面又說使用UTF-8編碼,是以估計是語誤。于是到網上查了一下,FOX 1.6版之前是沒有I18N的,1.6版才使用UTF-8編碼);
● FOX不支援Windows标準對話框,但有一個替代方案。
Java
● Java程式在運作時編譯成位元組碼,這意味着當使用者第一次啟動程式時,将耗費更長的時間,而程式相應也會比較遲鈍(Java的本地編譯器GCJ已經可用,但是并不支援Java所有的特性);
● 另一方面,wxWidgets直接編譯成機器碼,是以運作很快;
● 沒有混淆的Java位元組碼很容易反編譯出來。如果你的應用程式是開源的,這無所謂,但是如果能夠檢視源代碼成為一個問題,那你就得想想辦法了(編譯成本地代碼的wxWidgets程式也能夠被反編譯,但是這個過程要比反編譯Java位元組碼困難得多);
● 使用基于Java的應用程式必須安裝JVM。近年來,随着JVM的普及,這已經不是大問題,但是,如果使用者使用的是舊版本的JVM,則可能會有性能或者安全的問題;
● 鑒于Java庫運作較慢,一些Java庫是使用的wxWidgets和C++編寫的!
● 上述問題的一個例子是wx4j,一個Java的wxWidgets實作。wx4j用wxWidgets綁定Java,可以讓Java程式員使用Java語言,但是擁有C++程式的速度;
● 為了實作跨平台,Java元件僅提供了各個平台公共的特性,一些平台相關的特性從Java API中去除了,這些包括Windows的工作列,Mac OS的菜單欄和Unix的檔案屬性等;
● 相比而言,如果你僅在一個平台上進行編譯,wxWidgets允許你直接使用平台相關的代碼代替 ifdef 預編譯,并且wxWidgets也有在不同平台模拟的元件,如MDI和樹控件;
● Java程式比C++程式占用更多的記憶體;
● “一次編寫,到處運作”依然是一個神話。所有的JVM都含有bugs,并且在一個平台上編寫一個“大”的Java程式,讓它在另外的平台也能運作,簡直是癡心妄想。并不是說這些問題wxWidgets都解決了,隻是它的情形并不會更糟;
SDL
● SDL(Simple DirectMedia Layer)是一個多媒體的C庫,适合于遊戲以及自定義元件,對于通用GUI元件并不很友善。它由很多SDL_開頭的C結構組成;
● SDL在LGPL version 2下發行;
● SDL僅允許單視窗運作;
● 極好的OpenGL內建(或者是建構在OpenGL之上的類庫,如OpenSceneGraph,CEGUI)。
SFML
● SFML(Simple and Fast Multimedia Library)是一個多媒體的C++庫,适合于遊戲開發以及自定義元件,對于通用GUI元素并不友善;
● SFML包含很多功能:音頻、網絡、線程等;
● SFML可以結合wxWidgets、Qt或者X11等使用。
Allegro
● 類似于SDL,Allegro是一個适用于遊戲開發跨平台C庫(包含很多背景使用的元件);
● 幾乎和wxWidgets一樣古老(大約1993年);
● Giftware協定(實質上是public domain);
● 需要使用gcc和一個彙編器建構;
● 在同一版本已經停止開發多年了,缺乏核心開發成員(原來的開發者已經不在開發團隊了),存在一些内部的争論者;
● 非常基礎的GUI功能,僅僅支援一個僅有邊框的視窗——你甚至不能移動這個視窗!
● “控件”僅僅是通過變長參數清單的函數進行支援,像Qt一樣自行繪制(預設的并不好看)。可以使用很簡單的API進行自定義(有一些子庫提供了比較好看的版本的控件);
● 非GUI部分(輸入等)是底層的,通常比wxWidgets的本地實作快一些;
● 能夠同wxWidgets共同使用,雖然Allegro有一些平台相關的函數去擷取視窗句柄,但你也可以通過這個視窗句柄建立一個wxWidgets視窗,并且用它指向的那個視窗做任何事情。而wxWidgets使用wxApp指向平台相關的main/WinMain stuff。Allegro要求你在main函數之後添加END_OF_MAIN()。這是整合wxWidgets和Allegro的主要要求,但并不是很大的工作量。
待續……
本文轉自 FinderCheng 51CTO部落格,原文連結:
http://blog.51cto.com/devbean/175190