私は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);
obj
Javascriptファイルでのみ定義すると、エラーが発生します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 オブジェクトのプロパティを変更することもできませんでした。
どんな助けでも本当に感謝します、ありがとう。