【问题标题】:Cross-platform GUI language/toolkit跨平台 GUI 语言/工具包
【发布时间】:2011-01-25 10:51:04
【问题描述】:

我正在尝试编写一个可以部署到 Windows、Mac OS X 和 Linux 的跨平台 GUI 应用程序。我的要求是:

  1. 所有三个部署平台的单一代码库,无需大量条件逻辑来处理平台之间的差异。
  2. 在所有三个平台上看起来都尽可能接近“原生”。
  3. 可轻松分发到所有三个平台,因为最终用户可以轻松安装它并且不会遭受极度膨胀(如 this ArsTechnica article. 中所述)

基于这些要求,我将工具包的选择范围缩小到 Qt 和 wxWidgets,因为我所知道的其他工具包(包括 Java 的 Swing 和 SWT、Flex、AIR 等)都不满足“原生看”的要求。在这两个最后的竞争者中,Qt 似乎为在我的所有三个部署平台上看起来和感觉都是原生的应用程序提供了更好的支持,但我愿意考虑相反的意见。

我不希望使用 C++ 作为实现语言,但我不确定是否有任何实用的替代方案。对于使用 C++ 以外的实现语言,我最大的担忧是部署问题。正如the Ars Technica article 中所讨论的那样,PyQt 在任何实际意义上都不满足“易于部署”的要求,而且我怀疑 Qt 的大多数其他语言绑定都会遇到相同的部署问题(至少在 Mac OS X 上)。Java(或 Scala) 与 QtJambi?QtRuby?wxPython?

有谁知道满足上述所有三个要求的语言和工具包的组合?

【问题讨论】:

    标签: user-interface qt cross-platform desktop wxwidgets


    【解决方案1】:

    大约 10 年前左右,以 XML 的跨平台风格(如 XUL)对 GUI 建模,然后使用特定于平台的渲染引擎处理 XML 文件来显示布局是很流行的。然而,这样做已不再流行。今天,在 2017 年,趋势是在允许您使用 HTML、CSS 和/或 JavaScript 编写所有内容的平台上构建您的应用程序,无论您的代码应该在什么环境中运行。

    此类工具的“第一代”产生了基本上是“混合”应用程序,其中 Web 应用程序在类似浏览器和特定平台的 WebViews 之上运行。然而,这种技术相当低效。您的应用程序感觉不是很“原生”,相当臃肿,而且它们往往缺乏性能。然而,在不同的环境中拥有一致的外观和感觉相对容易。 Phonegap / Cordova 是最流行的移动环境平台和 NW.js 桌面环境。

    “第二代”不同:它们将所有内容编译为完全“原生”的、特定于平台的二进制文件。尽可能使用“本机”小部件,而不是依赖 WebView。这使您的应用程序具有更“原生”的外观和感觉,通常不会臃肿并且性能更好。但是,不同平台之间会有更多差异。例如 NativeScriptReact NativeTabris.js(均适用于移动环境)。

    不幸的是,目前还没有用于桌面的“第二代”工具。所以,现在,如果你想构建一个跨平台的桌面应用程序,你就会被“第一代”工具所困。 NW.js 的跟踪记录比 Electron 更长,并且支持 Electron 中不存在的各种功能,但 it also comes with its drawbacks。 AppJS 仍然较老,但不像其他两个那样成熟 - 也没有那么受欢迎。

    无论如何,他们对 WebView 的依赖意味着您的应用程序将更像是一个 Web 应用程序,而不是桌面应用程序。和bloat and performance drawbacks are inevitable with this kind of solution。这意味着您永远不会获得与直接用 Java 或 C++ 编写的代码相同的性能,也不会获得在“第二代”平台中获得的相同性能,并且永远不会感觉同样“原生”。但是,它仍然可以是最好的解决方案,例如。当跨不同平台的一致外观更重要时,或者当您具有 Web 开发人员背景时。

    如果性能、不臃肿和您的应用程序获得“原生”感觉是重要的标准,那么您可能需要再等一会儿,直到第一个“第二代”平台出现在桌面上。桌面应用平台走上与移动应用平台相同的演进路径确实只是时间问题,尽管它实际上可能以对现有移动平台的“桌面扩展”的形式出现。

    从目前的情况来看,您似乎很快就能使用完全相同的代码库为桌面和移动设备编写“原生”应用程序。由于 React Native 已经有了添加 support for Windows 10support for MacOS 的插件,我个人会选择 React Native 并给他们的开发团队一些时间,直到他们支持我需要支持的所有桌面环境并且这些桌面扩展足够成熟以用于生产环境。

    如果您不能等待那么久,您不想赌未来会发生什么,或者如果这些标准对于您今天要构建的任何应用程序都不是那么重要,您可能想尝试一些目前可用的“第一代”平台,看看哪个最适合您。请注意缺点!

    一如既往,明智地选择......


    热门平台

    第一代移动环境平台(iOS 和 Android)

    • Meteor(建立在 Cordova 之上)
    • Ionic(建立在 Cordova 之上)

    适用于移动环境的第二代平台(iOS 和 Android)

    桌面环境平台(Windows、Linux 或 MacOS)

    智能家居和物联网设备平台

    【讨论】:

      【解决方案2】:

      你看过Xojo吗?它绝对满足您的所有三个要求,并且比 C++ 更易于学习和使用。

      【讨论】:

        【解决方案3】:

        在我的日常工作中,我一直在使用 perl 和 wxWidgets 开发跨平台(Windows / MacOS / Linux)。这种组合很适合用于开发(我是 perl 黑客),而且我很少需要在每个平台上包含专门的代码。有一些 perl 模块可以帮助解决这个问题(例如 File::HomeDir,它知道各种平台上文档目录等的规范位置)。

        对于发布,我完全不依赖系统 perl 安装,而是构建包含在发布中的 perl 安装。这样我就可以完全控制应用程序的运行环境。我通过 innosetup 发布了一个 Windows 安装程序包,这是一个包含 .app 的 mac os .dmg 文件,用户可以将其拖到他们的 /Applications 中,对于 linux,我构建了 debian 和 redhat 包。

        【讨论】:

          【解决方案4】:

          Java 确实通过使用 SystemLookAndFeel 支持“本地外观”应用程序。最快的尝试方法是在应用程序启动时调用以下命令。

          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
          

          查看这里以获取有关 Java 中可用外观的更多信息。

          http://java.sun.com/docs/books/tutorial/uiswing/lookandfeel/plaf.html

          【讨论】:

          • kemisto,作为一个 KDE 用户,我完全明白你的意思。 Swing 应用程序在 KDE 上看起来非常格格不入,即使在 Gnome 下,原生的外观和感觉也只是肤浅的。
          【解决方案5】:

          wxWidgets 相当不错,并且确实包含一些非 GUI 代码(与 kemiisto 所说的相反):线程、套接字等。

          wxWidgets 的好处是 wxPython 实际上应该很容易在 OS X 上部署。还有一些其他的 wx 语言绑定,但 wxPython 可能是最古老的绑定之一。

          【讨论】:

          • 都是相对的!与 Qt 框架或(尤其是)Java SE wxWidgets 相比,它是纯 GUI 库。
          • 如果将可分发的 wxPython 应用程序部署到我的所有三个目标平台真的很容易,那么这对我来说将是赢家。是否可以为 Mac OS X 创建一个标准的“.app”文件,用户可以通过通常的机制“安装”?还是他们需要先安装支持库?如果可以创建单个 .app 包,它是否会像 PyQt 应用程序一样臃肿?
          • 您应该能够在 OS X 的 .app 中打包 wxPython 框架(翻译:打包它,这样用户就不必先安装支持库)。如果您无法使用 Apple 的 PackageMaker 创建安装程序,该程序会同时安装 wxPython 和您的应用程序。 wxPython 也预装在 OS X 上(但在我的 64 位机器上只安装了 32 位版本,所以它给了我一个错误)......我确信它是 wxPython 的旧版本,所以你可能不想使用它。
          【解决方案6】:

          Java/SWT 是不错的选择之一。你可以找到很多关于它的信息here

          【讨论】:

          • 使用 Eclipse 多年,我不认为 SVT 生成的应用程序外观和感觉都是真正的原生。
          • Eclipse 看起来不像是原生的,因为它的库包含看起来很酷的自定义组件。
          【解决方案7】:
          1. 这取决于您的需要。但总的来说,Qt Framework(使用任何语言)和 Java SE(使用任何语言)要好得多,因为它不仅具有跨操作系统的 GUI 库,而且还具有跨操作系统的网络、线程…… wxWidgets 只是 GUI。
          2. Qt 和 wxWidgets 都很不错。根据我的经验,Qt 更好。 Swing 是……嗯,不太好。
          3. 用 C++ 和 Java Swing 应用程序编写的 Qt 和 wxWidgets 应用程序在 Windows、Mac 和 Linux 上部署并不难。规则是,当您使用“本机”语言进行编程时,部署很简单。我所说的“原生”语言是指编写框架本身所用的语言。

          PyQt 在任何实际意义上都不满足“易于部署”的要求...

          Python(以及任何其他默认实现作为解释器的语言)应用程序很难在通常意义上部署(我的意思是以独立可执行文件的形式)。

          所以你可能有两个选择:

          1. C++/Qt 或 C++/wxWidgets。
          2. Java/Swing 如果对原生外观的要求不是很严格。

          【讨论】:

          • 感谢您的回答。恐怕这就是我怀疑的答案。 “害怕”是因为我真的不想使用 C++。哦,好吧,至少带有 Qt 的 C++ 不如带有 MFC 的 C++ 糟糕。 :)
          • wxWidgets 有跨平台的网络、线程、文件系统和许多其他非 GUI 类,顺便说一下,它不是仅 GUI 的。
          【解决方案8】:

          .Net(C# 或 VB.Net)是我将用于此的(事实上,它我用于我自己的应用程序的)。感谢 Mono 项目,.Net 应用程序可以在 Mac 和 Linux 以及 Windows 上运行,而无需对代码进行任何修改(除非您正在调用 Windows API 函数)。您甚至不必编译程序的不同版本:同一个 EXE 将在所有平台上运行。

          【讨论】:

          • Mono 应用程序的部署/安装如何工作?对于 Mac OS X 上的最终用户来说,这是一个繁重的过程(意味着他们需要单独安装 Mono,然后安装我的应用程序),还是我可以创建一个简单的 .app 文件并分发它? Mono 应用程序在 Mac OS X 上看起来是原生的吗?
          • OS X 上的 Mono 使用 GTK 外观。太丑了OS X 上的 IDE (MonoDevelop) 运行起来很糟糕......而且我对部署没有任何想法已经绰绰有余了。 =)
          • @Jason:您的用户需要先安装 Mono(如果他们还没有安装),然后再安装您的应用程序,尽管我认为您可以构建一个可以同时完成这两项工作的安装程序(您可以在 Windows 中,尽管我不打扰。关于外观和感觉的主题,我会选择kemiisto,尽管我认为 Mac OS 本身看起来很糟糕。我的应用程序几乎 100% 是所有者绘制的,所以它不会按钮、菜单等的外观对我来说很重要。
          • 听到来自 .NET(所以我可以假设是 Windows)粉丝对 Mac OS X 外观和感觉的批评我并不感到惊讶。 ;-) 但相信我,大多数 Mac 用户真的很喜欢它,并且对任何其他选择感到非常不舒服。可能是 100% 自绘是另一种选择...
          • @kemiisto:我真的不认为 Mac OS 很糟糕——只是被高估了。而且我完全理解让应用程序表现得像它们实际上属于您的操作系统的愿望 - 我在 Windows 中使用 iTunes。 :) 这就是为什么我使用一个似乎不属于任何操作系统的界面。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-12
          相关资源
          最近更新 更多