我计划为 Mac 和 Windows 构建一个 GUI 应用程序。我一直在对技术选择进行一些研究,例如语言、库和构建工具,以便我可以在两个平台之间共享尽可能多的代码。
主要要求是:
- 符合 Mac App Store 要求。
- Mac 和 Windows 上的原生外观。
- 需要在 Mac 上调用 Quartz Window Services,在 Windows 上调用 Windows API。
- 使用 SQLite 存储和读取数据。
我的帖子的长度已经失控,所以我把我的问题作为摘要移到了顶部,而上下文在下面。
问题
- 我倾向于使用 Python 来简化编程。这对我来说是正确的选择吗?如果不是,为什么 C++ 会更好?如果是这样,我该如何设置 py2app 和 pyobjc 来编译 python 并构建一个独立的应用程序来为 GUI 加载 XIBs?
- 为了更本机的界面,我不应该在 Mac 上使用跨平台 GUI 库,这对吗?还是使用 QT 或 wxWidgets 会更好?
- 如果我走错了路和/或有我没有考虑过的更好的解决方案,请指出:)
到目前为止我的研究和结论
图形用户界面库
对于 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。我对现有程序做了一些额外的研究,发现VLC、Chrome和Transmission都为 Mac 制作原生 GUI,而 VLC 使用 QT 用于 Windows,Chrome 使用自定义框架,Transmission 使用 GTK+ 和 QT 用于 Linux。
我想我已经决定使用 Cocoa GUI for Mac 和 Qt 或 wxWidgets for Windows,但仍然在 C++ 和 Python 之间进行共享逻辑。