在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平台下开发图形界面程序当之无愧的首选方案。