最常用的地图交互就几个,比如鼠标在地图上按下的时候可以拾取经纬度坐标,然后传给Qt程序,再比如对设置的设备点进行单击的时候,通知Qt程序单击了哪一个设备点,好让Qt程序识别并作出反应比如弹出对应点的详细信息或者视频预览等。让网页执行js函数这种单向的操作,其实无论何种浏览器内核都支持的,并不需要注入类或者添加qwebchannel.js文件之类的,你只需要放心大胆的调用runJavaScript或者evaluateJavaScript函数。而如果想要网页发送对应的数据给Qt程序的话,就需要额外的处理了。
在webkit中要实现从网页传回数据交互,只需要在网页载入完毕的信号loadFinished中注入类对象即可 webView->page()->mainFrame()->addToJavaScriptWindowObject("objName", webJsData);,而在webengine控件中需要增加两步,第一步是需要在网页里面引入js文件 <script type=\"text/javascript\" src=\"qwebchannel.js\"></script>,第二步是生成QWebChannel通信对象 new QWebChannel(qt.webChannelTransport, function(channel){window.receiveData = channel.objects.receiveData;}),第三步是注入类对象 QWebChannel *channel = new QWebChannel(this);channel->registerObject("objName", webJsData); webView->page()->setWebChannel(channel);
做完了上面的注入类以后,在网页中写好对应的window.receiveData即可,receiveData为对应的类的public的槽函数,这里为了复用所有的数据传回的情况,特意写了通用的receiveData函数,void receiveData(const QString &type, const QVariant &data);定义两个参数,这样就涵盖了所有的情况 type表示类型相当于唯一标识,而data是QVariant类型,即可以是字符串也可以是整数或者数组,都能自动转换的,这样的话就一个类涵盖了所有的各种可能的情况,都可以通过type来区分,通过data的类型去判断并转换数据。
//需要自定义继承自QObject的类来接收QWebEngineView交互数据,不然会打印很多烦人的信息
class WebJsData : public QObject
{
Q_OBJECT
public:
static WebJsData *Instance();
explicit WebJsData(QObject *parent = 0);
public slots:
//定义两个参数,这样就涵盖了所有的情况 type表示类型相当于唯一标识
void receiveData(const QString &type, const QVariant &data);
signals:
void receiveDataFromJs(const QString &type, const QVariant &data);
};
WebJsData *WebJsData::Instance()
{
static WebJsData self;
return &self;
}
WebJsData::WebJsData(QObject *parent)
{
}
void WebJsData::receiveData(const QString &type, const QVariant &data)
{
//可以在这里重新梳理好再发出去信号
emit receiveDataFromJs(type, data);
}
list << QString(" map.addEventListener(\"click\", function(e) {");
list << QString(" window.%1('point', e.point.lng + \",\" + e.point.lat);").arg(callFun);
list << QString(" });");
//自定义方法显示标注详细信息
list << QString(" function addInfoWindow(marker, poi){");
list << QString(" var title = '<div style=\"color:#CE5521;\">' + poi.name + '</div>';");
list << QString(" var list = [];");
list << QString(" list.push('<table><tr style=\"vertical-align:top;line-height:25px;font-size:12px;\">');");
list << QString(" list.push('<td style=\"white-space:nowrap;word-break:keep-all;\">地址:</td>');");
list << QString(" list.push('<td>' + poi.addr + '</td>');");
list << QString(" list.push('</tr></table>');");
list << QString(" var infoWindow = new BMap.InfoWindow(list.join(\"\"),{title:title, width:60});");
//单击以后弹出提示信息或者发送信号出去
list << QString(" var markerClick = function() {");
#if 0
list << QString(" marker.openInfoWindow(infoWindow);");
#else
list << QString(" window.%1('marker', poi.name);").arg(callFun);
#endif
list << QString(" };");
//添加单击监听器
list << QString(" marker.addEventListener(\"click\", markerClick);");
list << QString(" }");
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。