私は新しいWebEngineを使って遊んで学びます。私はQt WebKitを使用して見つかったいくつかの同様のメソッドを見つけようとしました:addToJavaScriptWindowObject()
Qt WebEngineを使用すると、JavaScriptウィンドウオブジェクトに関数を登録するためにQWebChannel
を使用する必要があることがわかりました。これが正しければ、次の質問が表示されます。
コンピュータにQt 5.4.0をインストールしました。きがついた qwebchannel.js
が私のコンピューターにインストールされているSDKに見つかりません。 Gitのソースで見つけました。
QWebEnginePage
とQWebEngineView
を備えたQtネイティブデスクトップアプリケーションがある場合、JavaScriptウィンドウオブジェクトに関数を登録するには何が必要ですか?
デスクトップアプリケーションは、作成したhttpページに自動的に移動します。したがって、QWebEngineView
に接続されているコンテンツにアクセスできます。
これを機能させるために実行する手順は何ですか?
Qt5.6では、C++パーツとJavaScriptを通信させる場合、 QWebEngineView で QWebChannel を使用する方法しかありません。 .cpp
ファイルで次のようにします。
m_pView = new QWebEngineView(this);
QWebChannel * channel = new QWebChannel(page);
m_pView->page()->setWebChannel(channel);
channel->registerObject(QString("TheNameOfTheObjectUsed"), this);
ここでは、JS側で使用できるTheNameOfTheObjectUsed
という名前のオブジェクトを登録すると言っているだけです。さて、これはJS側で使用するコードの一部です:
new QWebChannel(qt.webChannelTransport, function (channel) {
// now you retrieve your object
var JSobject = channel.objects.TheNameOfTheObjectUsed;
});
ここで、JS側でクラスのいくつかのプロパティを取得する場合は、C++側に文字列、整数、ロングを返すメソッドが必要です...これは、C++側では次のようになります。 、あなたの.h
:
Q_INVOKABLE int getInt();
Q_PROPERTY(int myIntInCppSide READ getInt);
そして今、あなたはJS側でこのようなintを取得します:
var myIntInJSside= JSobject.myIntInCppSide;
これは非常に簡単な説明ですので、ご覧になることをお勧めします このビデオ これは私にとって非常に役に立ちました。また、QWebChannelによって提供される JavaScript API の詳細、および QWebChannel に関するドキュメントもご覧ください。
お役に立てば幸いです。
ページとの通信のもう1つの簡単な方法は、 runJavaScript
関数を使用することです。
_view->page()->runJavaScript("alert('Hello from C++');");
_
これには制限があります。呼び出しはC++側から開始する必要があり、JSからの同期応答のみを取得できます。ただし、利点もあります。基になるWebページを変更する必要はありません。
上記の例のように、現在開いているWebページにはQWebEngineView::page()
関数を使用してアクセスできます。ナビゲーション中、ブラウザは次のページがネットワークから受信されるまでページを変更しないため、この関数はいつでも有効なページオブジェクトを返します。ただし、JSは、DOMツリーがまだ構築されておらず、ページ上の一部のスクリプトがまだ実行されていない_document.readyState == 'loading'
_に表示されるように、新しいページの読み込みを中断する場合があります。この場合、DOMContentLoaded
イベントを待つ必要があります。
Qtには、これに関するドキュメントがあります。
QWebSocketServer
のHTML/JavascriptがWebSocketを使用して接続するcppアプリにQWebEngineView
を追加する必要があります。次に、双方向通信にQWebChannel
を使用します。