因为我是javascript/HTML的新手,最近我开始了一个使用Qt QWebEngineView的项目。一段时间以来,我一直在寻找从C++程序到Javascript共享数据的最佳方式。到目前为止,我能够向Javascript程序发送数据的唯一方法是使用QWebEnginePage::runJavaScript
函数。我也看到了使用这里描述的QWebChannels
的可能性,但由于其简单性,我更喜欢QWebEnginePage::runJavaScript
。
到目前为止,我使用runJavaScript
方法遇到的唯一问题是,为了编写一个变量,需要在HTML文件中定义它,实际上我不能100%确定这是否是唯一的方法,但这是我唯一的方法
在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();
...
使用此解决方案,如果我创建PositionState
类的对象并从javascript文件中调用函数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);
如果只在Javascript文件中定义obj
,我会得到错误js: Uncaught ReferenceError: obj is not defined
。如果我用Id="obj"
在HTML文件中定义一个变量,并运行相同的脚本,我会得到错误js: Uncaught TypeError: obj.setPosition is not a function
,即使我使用的不是obj.setPosition
,而是document.getElementById('obj').setPosition
,也会出现错误。
因此,我从几乎没有HTML/Javascript知识中得到的是,HTML文件不知道我的类定义,因此无法识别setPosition
方法。所以我的问题是,是否有一种方法可以从C++代码中编写类对象。
我还尝试使用类似var Position = {Latitude: 0, Longitude: 0, Heading: 0}
的JavaScript对象,并从C++代码中运行带有QStringPosition = {Latitude: 40, Longitude: 9, Heading: 20};
的脚本,但也无法更改Position对象属性。
任何帮助都将不胜感激,谢谢。
老实说,你似乎把事情搞得过于复杂了。。。
您的";"简化器";这种方法并不像使用QWebChannel在JS和C++世界之间共享对象那样简单。此外,通过另一种方式,您正在失去很多功能:连接到JS中的Qt信号,重载方法,直接从JS读取和设置属性。。。
只需使用QWebChannel将QObjects注册到QWebEnginePage中,将QWebChannel加载到HTML页面中,设置连接,就可以了!
本文对如何做到这一点进行了非常简单的解释(带有代码片段(。
你没有必要重新发明轮子。