在桌面Linux環境下開發圖形界面程序的方案對比

在Linux下開發GUI程序的方法有不少,好比Gnome桌面使用GTK+做爲默認的圖形界面庫,KDE桌面使用Qt做爲默認的圖形界面庫,wxWidgets則是另外一個使用普遍的圖形庫,此外使用Java中的Swing/AWT組件也能夠用於開發Linux下的GUI應用。java

本文將依次介紹GTK+、Qt、wxWidgets和Swing/AWT,對其進行對比分析。數據庫

1. GTK+編程


平臺支持數組

雖然GTK+最初是爲X Window系統開發的,可是目前已經發展成爲一個跨平臺的圖形界面API,其支持的平臺包括:瀏覽器

  • Linux
  • Unix
  • Windows
  • Mac OS X

許可協議安全

GTK+基於LGPL協議發佈,所以能夠將GTK+的二進制動態連接庫文件整合到私有軟件中而無需額外受權。網絡

語言支持框架

GTK+自己是用C語言編寫的,可是能夠很方便地經過語言綁定(language binding)和其它語言協同工做,GTK+不一樣版本的語言綁定支持狀況以下圖所示。工具

gtk-lang

其中帶有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),其支持的平臺包括:

  • Windows
  • Mac OS X
  • Linux / Embedded Linux / VxWorks
  • Solaris
  • Android
  • iOS
  • BlackBerry

許可協議

Qt支持LGPL 2.1協議和一個商業協議,所以能夠將Qt的二進制動態連接庫文件整合到私有軟件中而無需額外受權。若是須要使用靜態連接將全部代碼打包爲單個的可執行文件,則須要公開源代碼。若是既要生成單個可執行文件,又不想公開代碼,則須要向Digia購買商業使用受權。

語言支持

Qt是一個基於C++的應用程序框架,可是同GTK+同樣,能夠經過語言綁定支持更多的語言,包括:

  • Python
  • Java
  • Ruby
  • BASIC
  • Ada
  • Perl
  • C#
  • D
  • Pascal
  • Lua
  • Haskell

須要注意的是,使用其它語言封裝Qt的原生接口會帶來必定程度上的性能損失。

其它特性

除了與圖形界面相關的部分以外,Qt還包括許多其它的類,好比:

  • 容器(數組、隊列、鏈表、集合、映射等)
  • 網絡操做(基本Socket、DNS操做、HTTP操做、SSL等)
  • 多媒體操做(音樂、視頻回放、攝像頭控制等)
  • SQL數據庫操做
  • OpenGL繪圖
  • XML操做
  • 串口操做
  • 基於Webkit的瀏覽器引擎

值得一提的是,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支持的平臺包括:

  • wxGTK: 使用Linux下的GTK+構建圖形界面
  • wxMSW: 使用Win32 API構建圖形界面
  • wxMac: 使用Mac OS下的Carbon構建圖形界面
  • wxOSX/Carbon: 使用Mac OS下的Carbon構建圖形界面
  • wxOSX/Cocoa: 使用Mac OS下的Cocoa構建圖形界面
  • wxX11: 使用Linux下的X11的通用顯示接口構建圖形界面
  • wxMotif: 使用Linux下的OpenMotif和Lesstif構建圖形界面

注意到這裏的描述方式有所不一樣,由於wxWidgets是基於本地接口構建UI的。

許可協議

wxWidgets使用wxWindows License做爲許可協議,這個協議是基於LGPL的,可是有一點不同:容許用戶在使用靜態連接的狀況下不公開應用代碼,所以實際上比LGPL協議更寬鬆。

語言支持

wxWidgets是基於C++編寫的的,同時還支持如下的語言綁定:

  • Ada
  • BASIC
  • D
  • Delphi
  • Erlang
  • Go
  • Haskell
  • Java
  • Lua
  • Perl
  • PHP
  • Python
  • Ruby

其它特性

在API和編程風格上,wxWidgets和MFC很是類似,可是封裝的不少類比MFC更高級。不少知名的MFC程序都會選擇用wxWidgets來改寫,來快速移植到其它平臺,如eMule用wxWidgets移植出aMule和xMule。

除了基本的圖形界面、佈局、事件系統外,wxWidgets還提供了不少其它的模塊,包括:

  • wxHTML: 進行HTML渲染
  • wxMedia: 對各類多媒體操做提供支持
  • wxNet: Socket支持
  • wxXML: XML文件讀寫支持

wxWidgets集成的功能相對於Qt而言較少,可是足夠完成絕大多數的常見任務。

4. Java / Swing / AWT


平臺支持

Swing和AWT是Java中最經常使用的兩種圖形組件。理論上全部支持Java虛擬機的平臺均可以使用Swing和AWT,包括:

  • Windows
  • Mac OS X
  • Linux
  • Solaris

固然還有大多數的移動、嵌入式平臺,這裏就不一一列舉了。

許可協議

Java的許可協議狀況有些複雜,網上有很多相關的討論,如這裏這裏這裏。目前Oracle和Android之間就存在着一些糾紛,可是目前彷佛沒有桌面Java應用因爲受權問題被起訴,做爲開發應用的工具,Java目前應該仍是比較安全的。

其它特性

AWT是Abstract Window Toolkit(抽象窗口工具包)的縮寫,這個工具包提供了一套與本地圖形界面進行交互的接口,與wxWidgets相似,所以具備相對比較高的運行效率。

而在JDK 1.2以後,出現了一組新的圖形API,叫Swing。Swing是基於AWT構建的,而且採用與Qt相似的方式經過繪圖模擬各個控件,所以靈活性大大增長。一般咱們看到的Java應用程序獨特的外觀大多都是基於Swing構建的。因爲Java原本運行效率就較低,搭配Swing後就更慢了,所以在嵌入式平臺AWT始終是構建圖形界面的首選方案。桌面應用則一般使用Swing搭建。

總結


summary

因爲本項目組的成員並不熟悉Java,故其學習成本相對更高一些。綜合各類因素,目前Qt仍是在Linux平臺下開發圖形界面程序當之無愧的首選方案。

相關文章
相關標籤/搜索