在Linux下開發GUI程序的方法有不少,好比Gnome桌面使用GTK+做爲默認的圖形界面庫,KDE桌面使用Qt做爲默認的圖形界面庫,wxWidgets則是另外一個使用普遍的圖形庫,此外使用Java中的Swing/AWT組件也能夠用於開發Linux下的GUI應用。java
本文將依次介紹GTK+、Qt、wxWidgets和Swing/AWT,對其進行對比分析。數據庫
1. GTK+編程
平臺支持數組
雖然GTK+最初是爲X Window系統開發的,可是目前已經發展成爲一個跨平臺的圖形界面API,其支持的平臺包括:瀏覽器
許可協議安全
GTK+基於LGPL協議發佈,所以能夠將GTK+的二進制動態連接庫文件整合到私有軟件中而無需額外受權。網絡
語言支持框架
GTK+自己是用C語言編寫的,可是能夠很方便地經過語言綁定(language binding)和其它語言協同工做,GTK+不一樣版本的語言綁定支持狀況以下圖所示。工具
其中帶有Gnome標記的上面7個語言是GTK+官方支持的,減號標記則表示只支持部分功能。佈局
其它特性
與wxWidgets和Qt不一樣,GTK+支持使用純C語言進行開發,此外還有一個基於C++的封裝項目叫GTKMM。
GTK+是基於GLib構建的,其中GLib是一個通用的C語言庫,相似於C++中的STL,提供了對動態數組、鏈表、隊列、散列表、平衡二叉樹、線程操做和XML解析等功能。
在全部的平臺上,基於GTK+的應用都看起來徹底同樣,除非應用了主題。GTK+老是經過主題來模擬原生控件。在Windows平臺下,能夠經過使用Wimp主題來得到Windows的原生外觀。
2. Qt
平臺支持
Qt是目前使用最普遍的跨平臺應用程序框架(Application Framework),其支持的平臺包括:
許可協議
Qt支持LGPL 2.1協議和一個商業協議,所以能夠將Qt的二進制動態連接庫文件整合到私有軟件中而無需額外受權。若是須要使用靜態連接將全部代碼打包爲單個的可執行文件,則須要公開源代碼。若是既要生成單個可執行文件,又不想公開代碼,則須要向Digia購買商業使用受權。
語言支持
Qt是一個基於C++的應用程序框架,可是同GTK+同樣,能夠經過語言綁定支持更多的語言,包括:
須要注意的是,使用其它語言封裝Qt的原生接口會帶來必定程度上的性能損失。
其它特性
除了與圖形界面相關的部分以外,Qt還包括許多其它的類,好比:
值得一提的是,Qt SQL模塊提供了對嵌入式數據庫SQLite的支持,無需引入外部的數據庫源碼。內容豐富的各類類庫極大地方便了開發,整個Qt開發工具包就組成了一個獨立的一站式開發平臺。
和GTK+同樣,Qt並不使用系統提供的控件,而是經過主題模擬這些控件。可是在一些特定的平臺,好比Mac OS X和Windows上對於一些最基本的控件經過本地系統調用實現。
Qt經過MOC系統對C++語言進行了擴展,提供了所謂的「信號-槽」(signal-slot)機制。基於信號-槽的事件處理很是優雅,缺點則是是編譯系統失去了通用性。
Qt的原生IDE是Qt Creater,同時兼容Qt的其它IDE也很是多,包括Visual Studio、Eclipse、XCode、Edyuk。
3. wxWidgets
平臺支持
wxWidgets是另外一個很是流行的跨平臺圖形界面庫。而GTK+ / Qt不一樣,wxWidgets並非經過繪圖來模擬控件,而是經過系統本地調用構建徹底原生的圖形界面。
wxWidgets支持的平臺包括:
注意到這裏的描述方式有所不一樣,由於wxWidgets是基於本地接口構建UI的。
許可協議
wxWidgets使用wxWindows License做爲許可協議,這個協議是基於LGPL的,可是有一點不同:容許用戶在使用靜態連接的狀況下不公開應用代碼,所以實際上比LGPL協議更寬鬆。
語言支持
wxWidgets是基於C++編寫的的,同時還支持如下的語言綁定:
其它特性
在API和編程風格上,wxWidgets和MFC很是類似,可是封裝的不少類比MFC更高級。不少知名的MFC程序都會選擇用wxWidgets來改寫,來快速移植到其它平臺,如eMule用wxWidgets移植出aMule和xMule。
除了基本的圖形界面、佈局、事件系統外,wxWidgets還提供了不少其它的模塊,包括:
wxWidgets集成的功能相對於Qt而言較少,可是足夠完成絕大多數的常見任務。
4. Java / Swing / AWT
平臺支持
Swing和AWT是Java中最經常使用的兩種圖形組件。理論上全部支持Java虛擬機的平臺均可以使用Swing和AWT,包括:
固然還有大多數的移動、嵌入式平臺,這裏就不一一列舉了。
許可協議
Java的許可協議狀況有些複雜,網上有很多相關的討論,如這裏、這裏和這裏。目前Oracle和Android之間就存在着一些糾紛,可是目前彷佛沒有桌面Java應用因爲受權問題被起訴,做爲開發應用的工具,Java目前應該仍是比較安全的。
其它特性
AWT是Abstract Window Toolkit(抽象窗口工具包)的縮寫,這個工具包提供了一套與本地圖形界面進行交互的接口,與wxWidgets相似,所以具備相對比較高的運行效率。
而在JDK 1.2以後,出現了一組新的圖形API,叫Swing。Swing是基於AWT構建的,而且採用與Qt相似的方式經過繪圖模擬各個控件,所以靈活性大大增長。一般咱們看到的Java應用程序獨特的外觀大多都是基於Swing構建的。因爲Java原本運行效率就較低,搭配Swing後就更慢了,所以在嵌入式平臺AWT始終是構建圖形界面的首選方案。桌面應用則一般使用Swing搭建。
總結
因爲本項目組的成員並不熟悉Java,故其學習成本相對更高一些。綜合各類因素,目前Qt仍是在Linux平臺下開發圖形界面程序當之無愧的首選方案。