0

私はjavascript/HTMLが初めてなので、最近Qt QWebEngineViewを使用してプロジェクトを開始しました。私は、C++ プログラムから Javascript にデータを共有するための最良の方法を見つけることにしばらく行き詰まりました。これまでのところ、Javascript プログラムにデータを送信できた唯一の方法は、QWebEnginePage::runJavaScript関数を使用することです。ここQWebChannelsで説明されている使用の可能性があることも確認しましたが、その単純さのために を好みます。QWebEnginePage::runJavaScript

私がこれまでにrunJavaScriptメソッドで抱えていた唯一の問題は、変数を書き込むために、これを HTML ファイルで定義する必要があるということでした。それが私のために働いた唯一の方法でした。私の現在のシナリオは次のようになります。

HTML ファイル内:

...
        <div id="latitude" ></div>
        <div id="longitude"></div>
        <div id="heading" "></div>
...

C++ ファイルの場合:

...
     double Latitude = 44.244; Longitude = 10.3; Heading = 90;
     QString jsQuery = QObject::tr(
                "document.getElementById('latitude').innerHTML  =%1; "
                "document.getElementById('longitude').innerHTML =%2; "
                "document.getElementById('heading').innerHTML   =%3;"
                ).arg(Latitude).arg(Longitude).arg(Heading));
     mapWebView->page()->runJavaScript(jsQuery);
...

この設定により、C++ コードから Javascript/HTML 側に変数を書き込むことができます。このソリューションでは、送信する値ごとに HTML ファイルに個別の変数をできるだけ多く作成する必要があるため、個別の変数を使用する代わりに、クラス オブジェクトまたは JavaScript オブジェクトを使用することが可能かどうかを尋ねたかったのです。以下のようなクラス メンバーを記述するいくつかのメソッドを含むクラスを作成し ます。 js ファイル内:

...
export default class PositionState{
    setPosition(latitude = 0.0, longitude = 0.0, heading = 0.0){
        this.Latitude   = latitude;
        this.Longitude  = longitude;
        this.Heading    = heading;
    }
    getLatitude(){
        return this.Latitude;
    }
    getLongitude(){
        return this.Longitude;
    }
    getHeading(){
        return this.Heading;
    }
}

var obj = new PositionState();
...

このソリューションでは、クラスのオブジェクトを作成し、javascript ファイルからPositionState関数を呼び出すとobj.setPosition(44,10.45)、オブジェクトのクラス メンバーは正しく設定されますが、C++ から実行しようとするとエラーが発生します。

 double Latitude = 44.244; Longitude = 10.3; Heading = 90;
 Qstring jsQuery = QObject::tr(
                    "obj.setPosition(%1, %2, %3);"
                    ).arg(Latitude).arg(Longitude).arg(Heading));
mapWebView->page()->runJavaScript(jsQuery);

objJavascriptファイルでのみ定義すると、エラーが発生しますjs: Uncaught ReferenceError: obj is not defined。そして、HTML ファイルで変数を定義しId="obj"て同じスクリプトを実行するとjs: Uncaught TypeError: obj.setPosition is not a function、エラーが発生しobj.setPositionますdocument.getElementById('obj').setPosition

したがって、HTML / Javascriptの知識がほとんどまたはまったくない場合、HTMLファイルはクラス定義を認識していないため、setPositionメソッドを認識していません。私の質問は、C++ コードからクラス オブジェクトを作成する方法があるかどうかです。

また、JavaScript オブジェクトを使用してvar Position = {Latitude: 0, Longitude: 0, Heading: 0}、C++ コードから QString を使用してスクリプトを実行 しようとしましPosition = {Latitude: 40, Longitude: 9, Heading: 20};たが、Position オブジェクトのプロパティを変更することもできませんでした。

どんな助けでも本当に感謝します、ありがとう。

4

1 に答える 1

0

正直なところ、あなたは物事を複雑にしすぎているようです...

あなたの「より単純な」アプローチは、QWebChannel を使用して JS と C++ の世界の間でオブジェクトを共有するほど単純ではありません。さらに、 JS で Qt シグナルに接続する、メソッドをオーバーロードする、JS から直接プロパティを読み取って設定するなど、別の方法で多くの機能を失っています。

QWebChannel を使用して QObjects を QWebEnginePage に登録し、QWebChannel を HTML ページにロードし、接続をセットアップするだけです。

この記事には、これを行う方法に関する優れた簡単な説明 (コード スニペット付き) があります。

車輪を再発明する必要はありません。

于 2020-10-15T09:29:16.133 に答える