web-dev-qa-db-ja.com

Qt WebEngineとQWebChannelの使用方法は?

私は新しいWebEngineを使って遊んで学びます。私はQt WebKitを使用して見つかったいくつかの同様のメソッドを見つけようとしました:addToJavaScriptWindowObject()

Qt WebEngineを使用すると、JavaScriptウィンドウオブジェクトに関数を登録するためにQWebChannelを使用する必要があることがわかりました。これが正しければ、次の質問が表示されます。

コンピュータにQt 5.4.0をインストールしました。きがついた qwebchannel.jsが私のコンピューターにインストールされているSDKに見つかりません。 Gitのソースで見つけました。

QWebEnginePageQWebEngineViewを備えたQtネイティブデスクトップアプリケーションがある場合、JavaScriptウィンドウオブジェクトに関数を登録するには何が必要ですか?

デスクトップアプリケーションは、作成したhttpページに自動的に移動します。したがって、QWebEngineViewに接続されているコンテンツにアクセスできます。

これを機能させるために実行する手順は何ですか?

16
user1185305

Qt5.6では、C++パーツとJavaScriptを通信させる場合、 QWebEngineViewQWebChannel を使用する方法しかありません。 .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 に関するドキュメントもご覧ください。

お役に立てば幸いです。

15
IAmInPLS

ページとの通信のもう1つの簡単な方法は、 runJavaScript 関数を使用することです。

_view->page()->runJavaScript("alert('Hello from C++');");
_

これには制限があります。呼び出しはC++側から開始する必要があり、JSからの同期応答のみを取得できます。ただし、利点もあります。基になるWebページを変更する必要はありません。

上記の例のように、現在開いているWebページにはQWebEngineView::page()関数を使用してアクセスできます。ナビゲーション中、ブラウザは次のページがネットワークから受信されるまでページを変更しないため、この関数はいつでも有効なページオブジェクトを返します。ただし、JSは、DOMツリーがまだ構築されておらず、ページ上の一部のスクリプトがまだ実行されていない_document.readyState == 'loading'_に表示されるように、新しいページの読み込みを中断する場合があります。この場合、DOMContentLoadedイベントを待つ必要があります。

0
user

Qtには、これに関するドキュメントがあります。

Qt WebChannelスタンドアロンの例

QWebSocketServerのHTML/JavascriptがWebSocketを使用して接続するcppアプリにQWebEngineViewを追加する必要があります。次に、双方向通信にQWebChannelを使用します。

0
bendiy