在桌面Linux环境下开发图形界面程序的方案对比

2023-11-18

在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的Swing/AWT组件也可以用于开发Linux下的GUI应用。

本文将依次介绍GTK+、Qt、wxWidgets和Swing/AWT,对其进行对比分析。

1. GTK+

平台支持

虽然GTK+最初是为X Window系统开发的,但是目前已经发展成为一个跨平台的图形界面API,其支持的平台包括:

LinuxUnixWindowsMac 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),其支持的平台包括:

WindowsMac OS XLinux / Embedded Linux / VxWorksSolarisAndroidiOSBlackBerry

许可协议

Qt支持LGPL 2.1协议和一个商业协议,因此可以将Qt的二进制动态链接库文件整合到私有软件中而无需额外授权。如果需要使用静态链接将所有代码打包为单个的可执行文件,则需要公开源代码。如果既要生成单个可执行文件,又不想公开代码,则需要向Digia购买商业使用授权。

语言支持

Qt是一个基于C++的应用程序框架,但是同GTK+一样,可以通过语言绑定支持更多的语言,包括:

PythonJavaRubyBASICAdaPerlC#DPascalLuaHaskell

需要注意的是,使用其它语言封装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++编写的的,同时还支持以下的语言绑定:

AdaBASICDDelphiErlangGoHaskellJavaLuaPerlPHPPythonRuby

其它特性

在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,包括:

WindowsMac OS XLinuxSolaris

当然还有大多数的移动、嵌入式平台,这里就不一一列举了。

许可协议

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在桌面Linux环境下开发图形界面程序的方案对比 的相关文章

  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 如何查明 Ubuntu 上安装了哪个版本的 GTK+?

    我需要确定 Ubuntu 上安装了哪个版本的 GTK 男人似乎不帮忙 这个建议 https stackoverflow com a 126145 会告诉您安装了哪个 2 0 的次要版本 不同的主要版本将具有不同的包名称 因为它们可以在系统上
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library

随机推荐