我计划为 Mac 和 Windows 构建一个 GUI 应用程序。我一直在技术选择方面进行一些研究,例如语言、库和构建工具,以便我可以在两个平台之间共享尽可能多的代码。
主要要求是:
- 满足 Mac App Store 要求。
- Mac 和 Windows 上的原生外观和感觉。
- Mac 上需要调用 Quartz Window Services,Windows 上需要调用 Windows API。
- 使用 SQLite 存储和读取数据。
我的帖子的长度已经失控,所以我将我的问题移到顶部作为摘要,而上下文则在下面。
问题
- 为了方便编程,我倾向于使用 Python。这对我来说是正确的选择吗?如果不是,为什么 C++ 会更好?如果是这样,我到底如何设置 py2app 和 pyobjc 来编译 python 并构建一个为 GUI 加载 XIB 的独立应用程序?
- 我不应该为了更原生的界面而在 Mac 上使用跨平台 GUI 库,对吗?或者我使用 QT 或 wxWidgets 会更好吗?
- 如果我走错了路和/或有我没有考虑过的更好的解决方案,请指出:)
到目前为止我的研究和结论
图形用户界面库
对于 Mac,我排除了使用跨平台 GUI 库(如 QT),因为它们似乎无法在 Mac 上提供本机外观和感觉(看起来不合适和/或很难编写遵循 Apple 的应用程序)人机界面指南)。 wxWidgets 说它使用本机库,但是这个post https://stackoverflow.com/a/4999048/1448071提到 wxPython 可能使用私有 Objective-C 调用,并且不太可能被批准用于 Mac App Store。最后,即使外观正确,两个平台的布局可能仍然需要有所不同。
因此,我计划对 Mac 界面使用原生 Cocoa GUI 库,但仍考虑对 Windows GUI 使用 wxWidgets。
Language
对于主要应用程序逻辑的语言,我的最佳选择似乎是 C++ 或 Python。显然,使用 Python 编写跨平台代码比使用 C++ 容易得多,但总是需要权衡。
Python
Pros:编写速度更快,维护也更容易。强大的跨平台库可以大大缩短开发时间。
Cons:使用Python意味着使用PyObjC,它已经一年多没有更新了(从svn可以看出),我不清楚它是否仍然可以与未来版本的Xcode和OSX一起使用。此外,要在 Xcode 之外使用 PyObjc 和 py2app 设置任何健全的构建配置并使用 xibs 作为 GUI,都是一场噩梦。
C++
Pros:在 Mac 和 Windows 上更轻松地设置构建配置和依赖项。运行速度比 Python 快得多,但就我而言,性能并不是一个大问题。
Cons:我不懂C++。我很擅长 C,但看起来这对我编写优秀的 C++ 没有多大帮助。我的总体印象是编写跨平台 C++ 要困难得多,但我可能是错的。有很多关于模糊错误的帖子。不过,Boost 看起来很有希望。
构建工具
如果使用 C++ 作为主要语言,那么在这两个平台上进行设置似乎都很简单。如果我使用 Python,那么在 Windows 上设置似乎也很简单,因为我将使用 wxWidgets 作为 GUI 并使用 py2exe 进行部署。
至于Mac和Python,标准选择似乎是pyobjc和py2app。不幸的是,我还没有找到任何使用 XIB 和 Cocoa 库而不是 QT 或 wxWidgets 的 py2app 构建配置的示例。我不希望 Xcode 管理构建,因为我更喜欢将 Python 文件和应用程序资源放置在 Xcode 之外
Xcode 项目目录。这将大大简化 Windows 的设置并使文件树更清晰。
关于QT的编辑:我又看了一眼 QT,花了几个小时和 QT 设计器一起玩。基本的 UI 元素(按钮、文本字段、标签)看起来与 Cocoa 元素相同。我轻松地将 QWindow 和 QTabView 与一些元素组合在一起,它看起来像一个 Cocoa 应用程序。然而,也有一些负面影响:
- 行为有点不对劲,比如缺乏弹性滚动,QTextEdit 没有指示焦点的蓝色阴影。
- QTableView 看起来不太像它的 Cocoa 对应物。
- 元素之间的间距、父视图的间距不遵循准则。它主要可以通过调整布局来修复,但需要在任何地方完成,我可以通过 Xcode 免费获得它。
- 缺少用于制作检查员的 HUD 元素。这是我的应用程序中很可能需要的东西,至少对于 Mac 端来说是这样。
- 辅助功能支持较差。
我知道我很挑剔,但需要挑剔才能做出好的用户界面。总的来说,QT 对于 Windows 来说似乎是一个很好的解决方案,但我想我会坚持使用 Cocoa for Mac。我对现有程序做了一些额外的研究,发现VLC http://wiki.videolan.org/Interfaces, Chrome https://stackoverflow.com/questions/874609/which-gui-library-does-google-chrome-use, and 传播 http://www.transmissionbt.com/所有这些都为 Mac 制作本机 GUI,而 VLC 使用 QT for Windows,Chrome 使用自定义框架,Transmission 使用 GTK+ 和 QT for Linux。
我想我已经决定在 Mac 上使用 Cocoa GUI,在 Windows 上使用 Qt 或 wxWidgets,但仍然在 C++ 和 Python 之间划分共享逻辑。