我计划为Mac和Windows构建一个GUI应用程序。我一直在做一些技术选择方面的研究,比如语言、库和构建工具,以便在两个平台之间尽可能多地共享代码。
主要要求是:满足Mac应用商店的要求。
Mac和Windows上的本地外观。
需要调用Mac上的Quartz窗口服务和Windows上的Windows API。
使用SQLite存储和读取数据。
我的文章篇幅已经失控,所以我把我的问题作为一个总结移到了顶部,而上下文则在下面。
问题为了便于编程,我倾向于使用Python。这是我的正确选择吗?如果不是,为什么C++会更好?如果是这样的话,我该如何设置py2app和pyobjc来编译python并构建一个独立的应用程序来为GUI加载XIBs呢?
我不应该为了更本机的界面而在Mac上使用跨平台GUI库,这对吗?或者使用QT或wxWidgets会更好吗?
如果我走错了路和/或有更好的解决方案我没有考虑,请指出:)
到目前为止我的研究和结论
GUI库
对于Mac,我排除了使用跨平台的图形用户界面库(如QT),因为它们似乎无法在Mac上提供本地的外观(看起来不合适和/或难以编写遵循苹果人机界面指南的应用程序)。wxWidgets说它使用本机库,但是这个post提到wxPython可能使用私有的Objective-C调用,不太可能被批准用于Mac应用商店。最后,即使外观正确,两个平台的布局可能仍需要改变。
因此,我计划在Mac界面上使用本地Cocoa GUI库,但仍在考虑在Windows GUI上使用wxWidgets。
语言
对于主要应用逻辑来说,我最好的语言选择是C++或Python。显然,用Python编写跨平台代码比C++更容易,但总是存在折衷。
Python
优点:编写更快,维护更容易。强大的跨平台库,可以大大缩短开发时间。
缺点:使用Python意味着使用PyObjC,它已经有一年多没有更新了(从svn可以看到),我不清楚它是否还能与Xcode和OSX的未来版本一起使用。另外,使用PyObjc和py2app设置任何正常的构建配置,并在Xcode之外为GUI使用xibs也是一个噩梦。
C++ >强>
优点:易于在Mac和Windows上设置生成配置和依赖项。运行速度比Python快得多,不过在我的例子中,性能并不是一个大问题。:EME>我不知道C++。我对C很好,但是它看起来不太好,我在编写好的C++方面有很大的帮助。我有一个普遍的印象,写跨平台的C++要困难得多,但我可能错了。有很多关于隐秘的bug的帖子。不过,Boost看起来很有希望。
构建工具
如果使用C++作为主要语言,设置两个平台似乎很简单。如果我使用Python,在Windows上设置似乎也很简单,因为我将使用wxWidgets来部署GUI和py2exe。
至于Mac和Python,标准的选择似乎是pyobjc和py2app。不幸的是,我还没有找到任何使用py2app的构建配置示例,该构建配置使用XIBs和Cocoa库,而不是QT或wxWidgets。我不希望Xcode管理构建,因为我希望Python文件和应用程序资源放在
Xcode项目目录。这将大大简化Windows和把文件树弄干净。
关于QT的编辑:我又看了一眼QT,花了几个小时和QT设计器一起玩。基本的UI元素(button、textfield、label)看起来与Cocoa元素相同。我把一个QWindow和一个QTabView简单地组合在一起,它看起来像一个Cocoa应用程序。不过,也有一些负面因素:行为有点偏离,比如缺乏弹性滚动,QTextEdit没有蓝色阴影表示焦点。
QTableView看起来不像它的Cocoa版本。
元素之间的间距,到父视图的间距,不遵循准则。通过调整布局,它基本上是可以修复的,但是需要在任何地方都做,我会免费使用Xcode。
缺少用于生成检查器的HUD元素。这是我很可能需要在我的应用程序,至少在Mac方面。
无障碍支持。
我知道我很挑剔,但要想成为一个好的用户界面,我必须很挑剔。总体来说,QT似乎是Windows的一个很好的解决方案,但我认为我将坚持使用Cocoa for Mac。我对现有程序做了一些额外的研究,发现VLC、Chrome和Transmission都为Mac制作了本地gui,而VLC使用QT作为Windows,Chrome使用自定义框架,Transmission使用GTK+和QT作为Linux。
我想我已经决定使用COMGUI来为Windows和Windows的QT或WxWIDGET使用,但是仍然在C++和Python之间分配共享逻辑。