当前位置: 首页 > news >正文

在Linux下开发GUI程序的方法

在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+(GIMP Toolkit)作为默认的图形界面库,KDEK桌面环境(K Desktop Environment)桌面使用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+不同版本的语言绑定支持情况如下图所示。

其中带有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搭建。

总结


由于本项目组的成员并不熟悉Java,故其学习成本相对更高一些。综合各种因素,目前Qt还是在Linux平台下开发图形界面程序当之无愧的首选方案。

转自:在Linux下开发GUI程序的方法_yi412的博客-CSDN博客_linux ui开发

相关文章:

  • QT工具——moc、rcc、uic
  • Electron如何打包使其支持龙芯和方腾、兆芯平台的麒麟系统
  • X Window与Microsoft Windows的相同点和不同点
  • X Window
  • C语言的内存管理-堆、栈等
  • Python 自动化操作 Excel
  • Lambda表达式
  • spinlock 使用介绍
  • Spring事务(Transaction)
  • Ajax-hook 原理解析
  • JavaScript Array 对象
  • SOCKET句柄泄露带来的内存灾难
  • 浪潮服务器安装Windows Server 2008 R2蓝屏
  • Linux服务器安装Windows虚拟机
  • AD域的详细介绍
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • C# 免费离线人脸识别 2.0 Demo
  • C++类中的特殊成员函数
  • docker python 配置
  • Elasticsearch 参考指南(升级前重新索引)
  • Redis 懒删除(lazy free)简史
  • SpiderData 2019年2月23日 DApp数据排行榜
  • vue.js框架原理浅析
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • WePY 在小程序性能调优上做出的探究
  • win10下安装mysql5.7
  • 阿里云前端周刊 - 第 26 期
  • 创建一个Struts2项目maven 方式
  • 从0实现一个tiny react(三)生命周期
  • 飞驰在Mesos的涡轮引擎上
  • 开发基于以太坊智能合约的DApp
  • 两列自适应布局方案整理
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何胜任知名企业的商业数据分析师?
  • 实战|智能家居行业移动应用性能分析
  • 微信小程序设置上一页数据
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 用 Swift 编写面向协议的视图
  • 在weex里面使用chart图表
  • 最近的计划
  • 阿里云ACE认证学习知识点梳理
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (0)Nginx 功能特性
  • (arch)linux 转换文件编码格式
  • (MATLAB)第五章-矩阵运算
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)ssm高校实验室 毕业设计 800008
  • (转载)Google Chrome调试JS
  • .Net Winform开发笔记(一)
  • .Net 知识杂记
  • .NET实现之(自动更新)