15

我计划为 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 加载 XIBs?
  2. 为了更本机的界面,我不应该在 Mac 上使用跨平台 GUI 库,这对吗?还是使用 QT 或 wxWidgets 会更好?
  3. 如果我走错了路和/或有我没有考虑过的更好的解决方案,请指出:)

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

图形用户界面库

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

因此,我计划为 Mac 界面使用本机 Cocoa GUI 库,但仍在考虑将 wxWidgets 用于 Windows GUI。

语言

对于主要应用程序逻辑的语言,我的最佳选择似乎是 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。不幸的是,我没有找到任何使用 py2app 构建配置的示例,它使用 XIB 和 Cocoa 库而不是 QT 或 wxWidgets。我不希望 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 使用 QT 用于 Windows,Chrome 使用自定义框架,Transmission 使用 GTK+ 和 QT 用于 Linux。

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

4

2 回答 2

10

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

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

这个 Qt错误在 4.8 版中已解决,其中某些 plist 文件将被写入 Apple 未批准的位置。

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


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

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

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

于 2012-06-14T04:44:27.157 回答
3

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

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

这让我在两个平台上都拥有原生 UI,并且对于较低级别的代码效果很好。

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

于 2013-09-12T00:21:21.810 回答