我计划为Mac和Windows构建一个GUI应用程序。我一直在做一些技术选择方面的研究,比如语言、库和构建工具,以便在两个平台之间尽可能多地共享代码。
主要要求是:
我的文章篇幅已经失控,所以我把我的问题作为一个总结移到了顶部,而上下文则在下面。
对于Mac,我排除了使用跨平台的图形用户界面库(如QT),因为它们似乎无法在Mac上提供本地的外观(看起来不合适和/或难以编写遵循苹果人机界面指南的应用程序)。wxWidgets说它使用本机库,但是这个post提到wxPython可能使用私有的Objective-C调用,不太可能被批准用于Mac应用商店。最后,即使外观正确,两个平台的布局可能仍需要改变。
因此,我计划在Mac界面上使用本地Cocoa GUI库,但仍在考虑在Windows GUI上使用wxWidgets。
Python
优点:编写更快,维护更容易。强大的跨平台库,可以大大缩短开发时间。
缺点:使用Python意味着使用PyObjC,它已经有一年多没有更新了(从svn可以看到),我不清楚它是否还能与Xcode和OSX的未来版本一起使用。另外,使用PyObjc和py2app设置任何正常的构建配置,并在Xcode之外为GUI使用xibs也是一个噩梦。
<强> C++ >强>
优点:易于在Mac和Windows上设置生成配置和依赖项。运行速度比Python快得多,不过在我的例子中,性能并不是一个大问题。
如果使用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应用程序。不过,也有一些负面因素:
我知道我很挑剔,但要想成为一个好的用户界面,我必须很挑剔。总体来说,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之间分配共享逻辑。
我想你可能太快就排除了Qt的可能性。这个guy报告说他在Mac应用商店发布了一个基于Qt的应用。
根据这个相关的answer,您可以指定Qt构建目标以使用Cocoa,而不是不推荐的Carbon API。
这个Qt bug在版本4.8中已经解决了一个位置未经苹果批准的plist文件。
这个Qt article讨论了为支持Mac的本地外观而引入的特殊功能。
关于C++,通常没有跨平台问题,如果使用诸如Qt或Boost之类的库来抽象平台相关的位(Boo..asio、Booost .FielSoSoC和Booost .Trand),Qt对于网络、文件和线程具有类似的抽象性。
C++绝对是一种“专家友好”的语言。如果可以在Qt上使用Python和PySide绑定,同时还能发布到App Store,那么我猜这可能是您的最佳选择。
如果你最终使用C++,那么我强烈建议你学会使用你所处理的所有设施,这将最小化手动内存管理和原始指针。了解容器类、字符串类和智能(引用计数)指针。
我最终选择了Python来共享逻辑。
在Mac上,我使用py2objc作为桥接器,py2app带有一些定制的打包配置。在Windows上,我直接使用Python和wxWidgets。
这允许我在两个平台上都有原生的ui,并且很好地解决了低级代码的问题。
然而,在开始更令人兴奋的冒险之前,我并没有在应用程序上取得太多进展。如果有读者希望使用这个问题/答案作为参考,我强烈建议您查看列出的所有技术并得出您自己的结论。
相关问题 更多 >
编程相关推荐