1

Qt Jambi や PyQt などの Qt の言語バインディングがすべての Qt モジュールを実装しているかどうかを知りたかったのです。つまり、ターゲット言語 (JAVA、python など) を Qt C++ モジュールと組み合わせる手段に過ぎないのか、それともターゲット言語がターゲット言語で実装されたモジュールと連携するのか。

たとえば、簡単な質問として、Qt Jambi は Java で記述された Qt モジュールで動作しますか? (そうであれば、異なるプラットフォームで実行できる Qt Jambi アプリケーションを作成できますか?つまり、すべての Qt Jambi モジュールは jar ファイルですか?)

4

2 に答える 2

2

PyQt に関する限り、「すべての Qt モジュールを実装しているかどうか」に対する答えは、「はい」と「いいえ」です。しかし、ほとんどいいえ。

PyQt はSIPツールを使用してバインディングを生成します。これがどのように行われるかを理解したい場合は、PyQt と SIP の作成者がプロセスを説明する方法を次に示します。

PyQt v4 では、metasip という内部ツール (もちろん PyQt を使用して記述) を使用します。これは SIP 用の IDE のようなものです。GCC-XML を使用して最新のヘッダー ファイルを解析し、関連データを XML として metasip プロジェクトに保存します。次に metasip は、以前のバージョンの API との差分と同等の処理を行い、確認が必要な変更にフラグを立てます。これらの変更は、GUI を介して行われ、TODO リストにチェックマークが付けられます。.sip ファイルの生成は、ボタンをクリックするだけです。私の Subversion リポジトリでは、PyQt v4 は基本的に 20M の XML ファイルです。Qt v4 のマイナー リリース用に PyQt v4 を更新するには、約 30 時間かかります。

生成されたコードがどのように機能するかという点では、他のバインディング ジェネレーターの機能とあまり変わらないと思います。Python には、拡張モジュールを作成するための非常に優れた C API があります。これが、非常に多くのサードパーティ ツールが Python バインディングを備えている理由の 1 つです。C++ クラスごとに、SIP 生成コードは、C で実装された対応する Python クラスを作成します。

そのため、PyQt は Qt モジュールのかなり薄いラッパーのセットにすぎず、通常、それ自体には機能を実装していません。ただし、これにはいくつかの例外があります。

まず、PyQt はさまざまな場所にいくつかのシンタックス シュガーを追加して、Qt API を Python コーダーにとってもう少し使いやすいものにします (たとえば、新しいスタイルのシグナルとスロットのサポート)。

次に、C++ と Python の基本的な言語の違いにより、PyQt が提供しても意味のない Qt API がいくつかあります (たとえば、Python には型キャストに相当するものはありません)。

最後に、uic モジュールがあります。PySide とは異なり、PyQt はQtUiToolsモジュールをまったくラップしません。代わりに、Qt ライブラリから同等の機能を実際に実装する純粋な Python で記述されたモジュールを提供しますしかし、これは規則ではなく例外です。

上記に加えて、間違いなく他にも多くの違いや省略がありますが、ここでは取り上げませんでした (特に PyQt5 に関して)。すべての言語バインディングと同様に、基本的な目的は、完全な 1 対 1 のマッピングではなく、2 つの言語間の実用的な通信手段を提供することです。

于 2014-03-16T19:01:21.353 に答える
1

彼らはすべてをカバーしているわけではありません。これは、PySide が 1 つのクラスのラッピングを欠いていたことを示す私の以前の回答の 1つです。

ここStack Overflowで気づいたので、手作りする必要がありました。一般に、特定の Qt バインディングの作成者に大きく依存します。それらの一部は十分にカバーされていますが、一部はしばらくメンテナンスされていません。

Qt Jambi と jar の質問については、確かではありませんが、ここで確認できるように、少なくともコードレベルの分離があります。

于 2014-03-16T05:18:47.747 に答える