1. 程式人生 > >在桌面Linux環境下開發圖形介面程式的方案對比

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

在Linux下開發GUI程式的方法有很多,比如Gnome桌面使用GTK+作為預設的圖形介面庫,KDE桌面使用Qt作為預設的圖形介面庫,wxWidgets則是另一個使用廣泛的圖形庫,此外使用Java中的Swing/AWT元件也可以用於開發Linux下的GUI應用。

本文將依次介紹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平臺下開發圖形介面程式當之無愧的首選方案。