1

Qt 5.5 では、彼らが提供するMinibrowser の例を使用して、 QWebView widgetとは異なるものを使用します。代わりに、QML とQtWebView モジュールを使用します。Javascript を見るとnavigator.appVersion、QWebView がカスタム AppleWebKit/538.1 (Qt5.5 に同梱されているもの) をロードし、QtWebView (違いに注意) がネイティブ コア OS AppleWebKit/601.1.56 をロードすることがわかります。これは、OSX (El Capitan バージョン) で Safari をロードすると、601.1.56 と表示されるため、確認されています。

しかし、問題は、ミニブラウザの Javascript 関数がバックエンドで C++ 関数を呼び出して、より強力なことを行うにはどうすればよいかということです。QWebView ウィジェットを使用していたとき、C++ Webkit ブリッジを使用して C++ オブジェクトを DOM に挿入し、C++ コードを呼び出すことができました。QtWebView を使用する QML ベースの Minibrowser の例でこれを行う方法について文書化された手法は見当たりません。テクニックは?

編集:ああ、明確にするために、私はこれでリモートWebページをWebサーバー経由で呼び出していません。file:// を介して何かを呼び出しているだけです。言い換えれば、私はリッチ Webkit インターフェイスを使用して、Qt ウィジェットと QML が提供できるものをはるかに超える超強力な GUI を提供しています。

4

1 に答える 1

0

私は答えを見つけました。Qt5.5では基本的にQtWebViewで実験の地に飛び込んでいます。クラス メソッドの大部分は文書化されておらず、将来変更される可能性があります。

今のところ、唯一の手法はメッセージ パッシングであり、 QWebView C++ Bridgeで使用できるようなネイティブ C++ クラス メソッドの呼び出しではありません。QWebView C++ Bridge は、QtWebView QML ではなく、QWebView ウィジェットでのみ動作します。したがって、このメッセージをnavigator.qt.postMessage()Javascript から QML に API で渡すと、QML は C++ を呼び出すことができます。その追加機能を取得するには、いくつかの手順を実行する必要があります。次に例を示します。

webviews Javascript から C++ メソッドを呼び出す

これはここに少しブログされています:

http://rschroll.github.io/beru/2013/08/21/qtwebview.experimental.html

例からわかるように、これらのインポートを main.qml に追加する必要があります。

import QtWebKit 3.0
import QtWebKit.experimental 1.0

次に、WebView{}セクションに次の行を追加する必要があります。

experimental.preferences.navigatorQtObjectEnabled: true

その時点でnavigator.qt.postMessage("call foo in C++");、QML にメッセージを送信するために呼び出すことができます。これは、WebView{}セクション内で次のように取得できます。

experimental.onMessageReceived: { ...do something here in the QML... }

QML は、次のようにメッセージを Javascript に直接渡すことができます。

experimental.postMessage("okay, I called foo in C++")

次に、Javascript で次のようにイベント リスナーを追加できます。

navigator.qt.onmessage = function(ev) {

  $('BODY').prepend(ev.data); // since console.log() is not possible

}

QML で C++ を呼び出す方法については、次の例を参照してください。

https://stackoverflow.com/a/17881019/105539

編集: Qt 5.5 で QtWebView を使用してさらに実験を行った後、次の点でかなり不安定に見えます。5.5 での使用はお勧めしません。Qt 5.5 では、今のところ QWebView ウィジェットを使用し、Qt の次のバージョン (Qt 5.6、5.7?) が出たらQtWebEngineに移行することをお勧めします。

  • デフォルトでは、必要のない右クリック コンテキスト メニューが表示されます。興味深いことに、実験的なライブラリをインポートして QML でこのプロパティを設定すると、これをオフにすることができます: experimental.preferences.navigatorQtObjectEnabled: true.

  • デフォルトでは、HTML5 postMessage() API (HTML5 のネイティブ API) は、有効にしない限り機能しないようexperimental.preferences.navigatorQtObjectEnabled: trueです。

  • を有効experimental.preferences.navigatorQtObjectEnabled: trueにすると、一部の HTML ページ要素でスクロールバーを有効にした場合にスクロールバーが消え、チェックボックスとラジオ ボタンが非常に奇妙に見え、ポップダウン選択リストボックスが機能しなくなりました。

  • ページをダブルクリックすると、ページがズームされます。

于 2015-11-20T02:31:42.870 に答える