3

QWebView を使用して setHtml() を呼び出し、HTML/JavaScript ページを表示しています。QWebFrame::evaluateJavaScript を使用して、JavaScript 関数への呼び出し (引数付き) を含む QString を渡すことで、データ更新を渡しています。Qt WebKit Bridge について読んだ後、もっと良い方法があるはずだと感じました。C++ の Qt オブジェクト/関数を JavaScript に公開することについての議論を見ましたが、他の方向は見ませんでした。(JavaScript が更新のために C++ 側をポーリングしないようにします。) JavaScript 関数をスロットとして Qt/C++ シグナルに接続する方法はありますか? (または同様のパターン)私は多くのドキュメントを調べ、質問を投稿したように感じます(これを入力したときに「同様の質問」でさえ)、この例を見たことがありません。正しい方向への情報、リンク、またはナッジに感謝します。

4

1 に答える 1

2

C++ オブジェクトを Javascript 層に公開するには、addToJavaScriptWindow オブジェクトを使用します。

page()->mainFrame()->addToJavaScriptWindowObject(QString("myObject"), myObject);

ここでドキュメントを確認してください: http://qt-project.org/doc/qt-4.8/qwebframe.html#addToJavaScriptWindowObject

これにより、C++ myObject が「myObject」として公開されます。

次に、投稿で探していることを正確に実行できます。myObject が次の方法でシグナルを宣言するとします。

信号:

mySignal(QString aParameter);

次のように、その信号を Web 側のスロットに接続するだけです。

myObject.mySignal.connect(これ、この.mySignalSlot);

この場合、mySignalSlot は C++ クラス側の mySignal 宣言と同じ署名を持つ必要があります (「同じ署名」とは、javascript が型指定されていないため、同じ数のパラメーターを意味するため、それぞれの型を宣言する必要はありません。彼ら)。

ここで本当に役立つのは、JSON オブジェクトを渡すことです。大量のデータを渡す必要がある場合は、base64 エンコーディングを使用できます。画像の場合、QTWebKit は QImage および QPixmap クラスをネイティブにサポートします。これらの最後の 2 つは、QTWebKit ブリッジ エンジンによって複雑な JavaScript オブジェクトとしてネイティブにエンコードされます。

于 2014-10-23T19:43:36.553 に答える