(轉)在Linux下開發GUI程序的方法

轉:https://blog.csdn.net/yi412/article/details/81100003

在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

綜合各種因素,目前Qt還是在Linux平臺下開發圖形界面程序當之無愧的首選方案。

因本人對Java特別熟悉,所以一般LInux Gui應用程序採用Java開發即可滿足要求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章