15

Mac および Windows 用の GUI アプリケーションを作成する予定です。2 つのプラットフォーム間でできるだけ多くのコードを共有できるように、言語、ライブラリ、ビルド ツールなどのテクノロジの選択について調査を行ってきました。

主な要件は次のとおりです。

  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 で承認される可能性は低いと述べています。最後に、見た目が正しいとしても、2 つのプラットフォームでレイアウトを変える必要があるでしょう。

したがって、Windows GUI に wxWidgets を使用することをまだ検討していますが、Mac インターフェイスにはネイティブの Cocoa GUI ライブラリを使用する予定です。

言語

メイン アプリケーション ロジックの言語として、C++ または Python のいずれかを選択するのが最善のようです。C++ より Python でクロスプラットフォーム コードを書く方が明らかに簡単ですが、常にトレードオフがあります。

パイソン

長所:記述がはるかに速く、保守が容易です。開発時間を大幅に短縮できる堅牢なクロスプラットフォーム ライブラリ。

短所: Python を使用するということは、(svn からわかるように) 1 年以上更新されていない PyObjC を使用することを意味し、Xcode および OSX の将来のバージョンで引き続き機能するかどうかは不明です。また、PyObjc と py2app を使用して適切なビルド構成をセットアップし、Xcode の外部で GUI に xib を使用することは悪夢です。

C++

長所: Mac と Windows の両方でビルド構成と依存関係を簡単に設定できます。私の場合、パフォーマンスは大きな問題ではありませんが、Python よりもはるかに高速に実行されます。

短所:私は C++ を知りません。私は C がかなり得意ですが、それが優れた C++ を作成するのに役立つとは思えません。クロスプラットフォームの C++ を書くのはずっと難しいという一般的な印象を持っていますが、それは間違っているかもしれません。あいまいなバグに関する投稿がたくさんあります。ブーストは有望に見えますが。

ビルドツール

メイン言語として C++ を使用する場合の設定は、両方のプラットフォームで十分に簡単に思えます。Python を使用する場合、GUI に wxWidgets を使用し、デプロイに py2exe を使用するため、Windows でのセットアップも簡単に思えます。

Mac と Python に関しては、標準的な選択は pyobjc と py2app のようです。残念ながら、QT や wxWidgets ではなく XIB と Cocoa ライブラリを使用する py2app のビルド構成の例は見つかりませんでした。PythonファイルとアプリケーションリソースをXcodeプロジェクトディレクトリの外に配置したいので、Xcodeでビルドを管理したくありません。これにより、Windows のセットアップが大幅に簡素化され、ファイル ツリーがすっきりします。

QTに関する編集: QTデザイナーで数時間遊んで、QTをもう一度見てみました。基本的な UI 要素 (ボタン、テキストフィールド、ラベル) は、Cocoa 要素と同じように見えます。QWindow と QTabView をいくつかの要素で簡単にまとめると、Cocoa アプリのように見えます。ただし、いくつかのマイナス点がありました。

  • 弾性スクロールがないなど、動作が少しずれています。QTextEdit には、フォーカスを示す青い影がありません。
  • QTableView は、対応する Cocoa とあまり似ていません。
  • 要素間の間隔、親ビューまでの間隔は、ガイドラインに従っていません。ほとんどの場合、レイアウトを微調整することで修正できますが、どこでも行う必要があり、Xcode で無料で入手できます。
  • インスペクタを作成するための HUD 要素がありません。これは、少なくとも Mac 側では、私のアプリで必要になる可能性が非常に高いものです。
  • アクセシビリティのサポートが不十分。

私はうるさいことを知っていますが、良いUIを作るにはうるさい必要があります. 全体的に QT は Windows 向けの優れたソリューションのようですが、私は Mac 向けの Cocoa に固執すると思います。既存のプログラムについてさらに調査を行ったところ、VLCChrome、およびTransmissionはすべて Mac 用のネイティブ GUI を作成し、VLC は Windows 用の QT を使用し、Chrome はカスタム フレームワークを使用し、Transmission は Linux 用の GTK+ および QT を使用することがわかりました。

Mac 用の Cocoa GUI と Windows 用の Qt または wxWidgets を使用することに決めたと思いますが、共有ロジックのために C++ と Python に分割されています。

4

2 に答える 2

10

Qt をあまりにも早く除外している可能性があると思います。このは、Mac App Store で Qt ベースのアプリを公開したと報告しています。

この関連する回答に従って、非推奨の Carbon API の代わりに Cocoa を使用するように Qt ビルド ターゲットを指定できます。

一部の plist ファイルが Apple によって承認されていない場所に書き込まれるというこの Qtのバグは、バージョン 4.8 で解決されました。

このQt の記事では、Mac のネイティブなルック アンド フィールをサポートするために導入された特別な機能について説明します。


C++ に関しては、Qt や Boost などのライブラリを使用してプラットフォームに依存するビット (Boost.Asio、Boost.Filesystem、および Boost.Thread が思い浮かびます。Qt には同様の機能があります。ネットワーク、ファイル、およびスレッドの抽象化)。

C++ は間違いなく「専門家に優しい」言語です。Qt に Python と PySide バインディングを使用でき、App Store に公開できる場合は、それが最善の策であると推測しています。

C++ を使用することになった場合は、すべての機能を自由に使用できるようになることを強くお勧めします。これにより、手動のメモリ管理と生のポインターを最小限に抑えることができます。コンテナー クラス、文字列クラス、およびスマート (参照カウント) ポインターについて学習します。

于 2012-06-14T04:44:27.157 に答える
3

結局、共有ロジックには Python を使用しました。

Mac では、py2objc をブリッジとして使用し、py2app をパッケージ化用のカスタム構成で使用しました。Windows では、Python と wxWidgets を直接使用しました。

これにより、両方のプラットフォームでネイティブ UI を使用できるようになり、低レベルのコードでもうまく機能しました。

しかし、よりエキサイティングなベンチャーに移る前に、私は実際にはアプリをあまり使いこなせませんでした. この質問/回答を参照として使用することを望んでいる読者がいる場合は、リストされているすべてのテクノロジを調べて、独自の結論を導き出すことを強くお勧めします。

于 2013-09-12T00:21:21.810 に答える