天天看點

wxWidgets與其他工具庫的比較(上)

本文是在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