构建Mac和Windows GUI应用程序

时间:2012-06-14 04:10:53

标签: c++ python cross-platform wxpython py2app

我打算为Mac和Windows构建一个GUI应用程序。我一直在研究技术选择,如语言,库和构建工具,这样我就可以在两个平台之间共享尽可能多的代码。

主要要求是:

  1. 符合Mac App Store的要求。
  2. Mac和Windows上的原生外观。
  3. 需要在Mac上调用Quartz Window Services,在Windows上调用Windows API。
  4. 使用SQLite存储和读取数据。
  5. 我的帖子的长度已经失控,所以我将问题移到了顶部作为摘要,而上下文更进一步。

    问题

    1. 我倾向于使用Python来简化编程。这对我来说是正确的选择吗?如果不是为什么C ++会更好?如果是这样,我究竟如何设置py2app和pyobjc来编译python并构建一个为GUI加载XIB的独立应用程序?
    2. 我是否正确,我不应该在Mac上使用跨平台GUI库,以获得更原生的界面?或者我会更好地使用QT或wxWidgets?
    3. 如果我走错路和/或有更好的解决方案我没有考虑过,请指出:)
    4. 到目前为止我的研究和结论

      GUI库

      对于Mac,我排除了使用跨平台GUI库(如QT),因为它似乎无法在Mac上提供原生外观(看起来不合适和/或难以使用)编写遵循Apple人机界面指南的应用程序。 wxWidgets说它使用本机库,但是这个post提到wxPython可能使用私有的Objective-C调用,并且不太可能被批准用于Mac App Store。最后,即使外观正确,两个平台的布局可能仍需要改变。

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

      语言

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

      的Python

      优点:编写速度更快,维护更轻松。强大的跨平台库,可以大大缩短开发时间。

      缺点:使用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方面而言。
      • 可访问性差支持。

      我知道自己很挑剔,但需要挑剔才能做出优秀的用户界面。整体QT似乎是Windows的一个很好的解决方案,但我想我会坚持使用Cocoa for Mac。我对现有程序进行了一些额外的研究,发现VLCChromeTransmission都为Mac制作原生GUI,而VLC使用QT for Windows,Chrome使用自定义框架,传输使用GTK +和QT for Linux。

      我认为我决定使用Cocoa GUI for Mac和Qt或wxWidgets for Windows,但仍然在C ++和Python之间分享共享逻辑。

2 个答案:

答案 0 :(得分:9)

我想你可能会过快地排除Qt。据guy报道,他在Mac App Store上发布了一个基于Qt的应用程序。

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

此Qt bug,其中某些plist文件将写入未经Apple批准的位置,已在4.8版中得到解决。

Qt article讨论了为支持Mac的原生外观而引入的特殊功能。


关于C ++,如果使用Qt或Boost等库来抽象出与平台相关的位(Boost.Asio,Boost.Filesystem和Boost.Thread),一般都没有跨平台问题, Qt具有类似的网络,文件和线程抽象方法。

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

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

答案 1 :(得分:2)

我最终使用Python进行共享逻辑。

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

这使得我可以在两个平台上都拥有原生UI,并且可以很好地处理低级代码。

然而,在进入更激动人心的企业之前,我实际上并没有在应用程序上走得太远。如果有任何读者希望将此问题/答案作为参考,我强烈建议您查看列出的所有技术并得出自己的结论。