构建Mac和Windows GUI应用程序

Yun*_*chi 12 c++ python wxpython cross-platform py2app

我打算为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说它使用本机库,但是这篇文章提到wxPython可能使用私有的Objective-C调用,并且不太可能被批准用于Mac App Store.最后,即使外观正确,两个平台的布局可能仍需要改变.

因此,我计划在Mac界面中使用原生Cocoa GUI库,但仍考虑将wxWidgets用于Windows GUI.

语言

对于主应用程序逻辑来说,似乎我最好的语言选择是C++或Python.显然,使用Python编写跨平台代码比使用C++更容易,但总是存在权衡.

蟒蛇

优点:更快写入和更容易维护.强大的跨平台库,可以大大缩短开发时间.

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

C++

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

缺点:我不懂C++.我对C非常好,但看起来这并不能帮助我写好C++.我的总体印象是编写跨平台C++要困难得多,但我可能错了.有很多关于晦涩的错误的帖子.虽然Boost看起来很有希望.

构建工具

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

至于Mac和Python,标准选择似乎是pyobjc和py2app.不幸的是,我没有找到任何使用pyibapp构建配置的例子,它使用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,ChromeTransmission都为Mac制作原生GUI,而VLC使用QT for Windows,Chrome使用自定义框架,而Transmission使用GTK +和QT for Linux.

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

Emi*_*ier 9

我想你可能会过快地排除Qt.这家伙曾报道,他publishd在Mac App Store中基于Qt的应用程序.

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

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

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


关于C++,如果使用诸如Qt或Boost之类的库来抽象出与平台相关的位(Boost.Asio,Boost.Filesystem和Boost.Thread,脑海中,Qt有类似的话),通常没有跨平台问题.网络,文件和线程的抽象).

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

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


Yun*_*chi 3

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

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

这使我能够在两个平台上拥有本机 UI,并且对于较低级别的代码来说效果非常好。

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