上一节已经将miniblink集成到qt,实现了浏览器得基本调用接口,这一节介绍如何实现通信。
1.C++调用js
miniblink接口wkeRunJSW可以实现C++调用js
例如我们在js中写一个绑定到window的函数openDialog
就可以这样调用
wkeRunJSW("window.openDialog()");
这跟cef,QtWebEngine完全一样
2.js调用C++
首先我们写一个测试的html如下:
<html>
<head>
<script>
function onInvokeMethodClicked() {
methodCallback("Recrod", "start", "param“);
}
</script>
</head>
<body οnlοad="onLoad()" id="main">
<h1 align="center" style="font-size:12pt; font-family:MS Shell Dlg 2;">Web Area</h1>
<div align="center" id="dragarea" style="height:40px; background-color: gray; color: white;" οnmοusedοwn="onDragAreaMouseDown()">
<span style="font-size:18pt; font-family:MS Shell Dlg 2;">you can drag this window in this area!</span>
</div>
<div align="center">
<label> Test Case for InvokeMethod </label>
<br />
<input type="button" value="Invoke Method" οnclick="onInvokeMethodClicked()" />
<br />
</div>
</body>
</html>
然后我们调用wkeJsBindFunction(functionName.toStdString().c_str(), fun, nullptr, paracount); 来绑定一个函数。在我的例子中为methodCallback。
所以这样调用
wkeJsBindFunction("methodCallback", methodCallback, nullptr, 3);
第一个参数时函数名,也就是我们js中要调用的函数名称,第二个参数是回调函数,js调用会回到到此函数,第三个参数一般无用,第四个参数为绑定函数的参数个数。
回到函数格式为:
jsValue WKE_CALL_TYPE methodCallback(jsExecState es, void* param)
{
if (0 == jsArgCount(es))
return jsUndefined();
jsValue arg0 = jsArg(es, 0);
jsValue arg1 = jsArg(es, 1);
if (!jsIsString(arg0))
return jsUndefined();
std::string mothod = jsToTempString(es, arg0);
std::string parmar = jsToTempString(es, arg1);
qDebug()<<"js-c++method:"<<QString::fromStdString(mothod);
qDebug()<<"js-c++parmar:"<<QString::fromStdString(parmar);
return jsUndefined();
}
在回到函数我们可以解析参数,获取调用的参数进而实现功能。
完毕