【问题标题】:Building a Mac and Windows GUI Application构建 Mac 和 Windows GUI 应用程序
【发布时间】:2012-06-17 02:22:47
【问题描述】:

我计划为 Mac 和 Windows 构建一个 GUI 应用程序。我一直在研究技术选择,如语言、库和构建工具,以便我可以在两个平台之间共享尽可能多的代码。

主要要求是:

  1. 满足 Mac App Store 要求。
  2. Mac 和 Windows 上的原生外观。
  3. 需要在 Mac 上调用 Quartz Window Services,在 Windows 上调用 Windows API。
  4. 使用 SQLite 存储和读取数据。

我的帖子的长度已经失控,所以我把我的问题作为摘要移到了顶部,而上下文在下面。

问题

  1. 我倾向于使用 Python 来简化编程。这对我来说是正确的选择吗?如果不是,为什么 C++ 会更好?如果是这样,我该如何设置 py2app 和 pyobjc 来编译 python 并构建一个独立的应用程序来加载 GUI 的 XIB?
  2. 为了获得更原生的界面,我不应该在 Mac 上使用跨平台 GUI 库,这对吗?还是使用 QT 或 wxWidgets 会更好?
  3. 如果我走错了路和/或有我没有考虑过的更好的解决方案,请指出:)

到目前为止我的研究和结论

GUI 库

对于 Mac,我排除了使用跨平台 GUI 库(如 QT),因为它们似乎无法在 Mac 上提供原生外观和感觉(看起来不合适和/或难以编写应用程序遵循 Apple 的人机界面指南)。 wxWidgets 说它使用本地库,但是这个post 提到 wxPython 可能使用私有的 Objective-C 调用并且不太可能被批准用于 Mac App Store。最后,即使外观正确,两个平台的布局可能仍然需要有所不同。

因此,我计划为 Mac 界面使用原生 Cocoa GUI 库,但仍在考虑为 Windows GUI 使用 wxWidgets。

语言

对于主要应用程序逻辑的语言,我的最佳选择似乎是 C++ 或 Python。显然,使用 Python 编写跨平台代码比使用 C++ 容易得多,但总要权衡取舍。

Python

优点: 编写速度更快,维护更容易。强大的跨平台库,可大幅缩短开发时间。

缺点: 使用 Python 意味着使用 PyObjC,它已经一年多没有更新了(从 svn 中可以看出),我不清楚它是否仍然适用于未来版本的 Xcode和 OSX。此外,在 Xcode 之外使用 PyObjc 和 py2app 设置任何健全的构建配置并使用 xibs 进行 GUI 是一场噩梦。

C++

优点:更容易在 Mac 和 Windows 上设置构建配置和依赖项。运行速度比 Python 快得多,但在我的情况下性能并不是一个大问题。

缺点:我不懂 C++。我很擅长 C,但看起来这对我编写好的 C++ 没有多大帮助。我的总体印象是编写跨平台 C++ 要困难得多,但我可能错了。有很多关于模糊错误的帖子。不过,Boost 看起来很有希望。

构建工具

如果使用 C++ 作为主要语言,在这两个平台上进行设置似乎都很简单。如果我使用 Python,在 Windows 上设置似乎也很简单,因为我会使用 wxWidgets 作为 GUI 和 py2exe 进行部署。

对于 Mac 和 Python,标准的选择似乎是 pyobjc 和 py2app。不幸的是,我没有找到任何使用 XIB 和 Cocoa 库而不是 QT 或 wxWidgets 的 py2app 构建配置示例。我不希望 Xcode 管理构建,因为我希望将 Python 文件和应用程序资源放在外部 Xcode 项目目录。这将大大简化 Windows 的设置并使文件树更清晰。

关于 QT 的编辑:我又看了一下 QT,花了几个小时和 QT 设计师一起玩。基本的 UI 元素(按钮、文本字段、标签)看起来与 Cocoa 元素相同。我用一些元素轻松地将 QWindow 和 QTabView 组合在一起,它看起来像一个 Cocoa 应用程序。但是,也有一些负面影响:

  • 行为有点偏离,比如缺少弹性滚动,QTextEdit 没有表示焦点的蓝色阴影。
  • QTableView 看起来不像它的 Cocoa 对应物。
  • 元素之间的间距,与父视图的间距,不遵循准则。大部分情况下可以通过调整布局来解决,但需要在任何地方完成,我会通过 Xcode 免费获得它。
  • 缺少用于制作检查器的 HUD 元素。这是我很可能在我的应用中需要的东西,至少在 Mac 端是这样。
  • 可访问性支持较差。

我知道我很挑剔,但需要很挑剔才能做出好的 UI。总体而言,QT 似乎是 Windows 的一个很好的解决方案,但我认为我会坚持使用 Cocoa for Mac。我对现有程序做了一些额外的研究,发现VLCChromeTransmission 都为 Mac 制作原生 GUI,而 VLC 在 Windows 上使用 QT,Chrome 使用自定义框架,Transmission 使用 GTK+ 和 QT Linux。

我想我已经决定在 Mac 上使用 Cocoa GUI,在 Windows 上使用 Qt 或 wxWidgets,但仍然在 C++ 和 Python 之间进行共享逻辑。

【问题讨论】:

  • 另一个选项 MonoMac mono-project.com/MonoMac tirania.org/monomac/archive/2011/Jan-31.html。据我了解,您需要编写两次前端代码——一次用于 Windows,一次用于 Mac。但是要共享大量代码,并在两者上都获得本机 UI。
  • 如果你需要 Mac AppStore 兼容性,为什么还要考虑 python?
  • @jdi:据此 (stackoverflow.com/questions/4940273/…),可以将 Python 应用程序部署到 Mac AppStore
  • @EmileCormier:他还说他不会推荐它 :-) 但知道它可能真的很有趣
  • @EmileCormier 我实际上链接(它有点隐藏)到同一个帖子上的不同答案,这可能会排除 wxPython for Mac,但是是的,他建议不要将它用于新项目动摇了我的信心在 Python 中。

标签: c++ python cross-platform wxpython py2app


【解决方案1】:

我认为您可能过快地排除了 Qt。这个guy 报告说他在 Mac App Store 上发布了一个基于 Qt 的应用程序。

根据这个相关的answer,您可以指定 Qt 构建目标以使用 Cocoa 而不是已弃用的 Carbon API。

此 Qt bug 将在 4.8 版中解决一些 plist 文件将被写入 Apple 未批准的位置。

Qt article 讨论了为支持 Mac 的原生外观而引入的特殊功能。


关于 C++,如果您使用 Qt 或 Boost 等库来抽象出与平台相关的位(例如 Boost.Asio、Boost.Filesystem 和 Boost.Thread,则通常不会出现跨平台问题, Qt 对网络、文件和线程有类似的抽象)。

C++ 绝对是一种“专家友好”的语言。如果可以为 Qt 使用 Python 和 PySide 绑定,同时仍然能够发布到 App Store,那么我猜这可能是你最好的选择。

如果您最终使用 C++,那么我强烈建议您学习使用所有可以使用的工具,这些工具可以最大限度地减少手动内存管理和原始指针。了解容器类、字符串类和智能(引用计数)指针。

【讨论】:

  • 我投了赞成票,因为我不确定你会从哪里获得一个支持 Mac AppStore 的跨平台 GUI 解决方案。 OP 所说的有很多取舍,但如果他坚持使用 C++,那么这似乎就是这样。
  • 我对 QT 的主要关注是我是否能够成功创建遵循Mac Human Interface Guidelines 的可用 GUI 应用程序。您链接的文章的屏幕截图似乎来自老虎。看来我必须尝试 QT 并亲自看看。很高兴知道它也可以针对 Cocoa 构建。你知道 Mac 上有哪些 UI 不错的 QT 应用吗?
  • 我建议您尝试编写一个包含您认为需要的所有 UI 元素的原型 Qt 应用程序,并检查它是否符合指南。这个原型应用程序应该是“愚蠢的”,背后没有任何业务逻辑。祝您好运,如果您在 Qt 中发现任何违反指南的内容,请告诉我们。
  • 刚刚花了几个小时玩 QT。将我的结论添加到问题中。
【解决方案2】:

我最终选择了 Python 来实现共享逻辑。

在 Mac 上,我使用 py2objc 作为桥梁,使用 py2app 和一些自定义配置进行打包。在 Windows 上,我直接使用了 Python 和 wxWidgets。

这让我在两个平台上都拥有原生 UI,并且非常适合低级代码。

但是,在开始进行更令人兴奋的冒险之前,我实际上并没有在应用程序上走得太远。如果有读者希望将此问题/答案用作参考,我强烈建议您查看列出的所有技术并得出自己的结论。

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2012-02-09
    • 2018-01-16
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多