(1)开篇
在开发中遇到QML与QWebEngineView中的网页互动的场景(将QML交互的参数传入到网页上);在WebChannel的js端遇到调用时机导致的问题,折腾了不短时间,特此笔记,备忘。
(2)情景还原
其情景为数据初始化:在html加载完成后,即刻调用业务对象的方法请求数据,最后在信号回调函数中接收数据。js代码如下:
<script type="text/javascript">
var webChannel = new QWebChannel(qt.webChannelTransport, function(channel) {
//(1)C++业务对象绑定
window.cppBizObj1 = channel.objects.cppBizObj1;
//绑定业务对象信号回调函数
window.cppBizObj1.reqImageCompleted.connect(onReqImageCompleted);
var imageNo = $("#07\\.png").attr("id");
//调用业务对象所“暴露”的方法
window.cppBizObj1.reqImage(imageNo);
});
$(function() {
//(2)页面DOM加载完成
var imageNo = $("#07\\.png").attr("id");
//调用业务对象所“暴露”的方法
window.cppBizObj1.reqImage(imageNo);
}); //onReady End
。。。
</script>
其中有2个时机:
- WebChannel初始化(绑定业务对象到js对象)
- 页面加载完成(onready)
问题:在哪个时机调用业务对象的方法?
思维定势以为是在时机2,但经过调试却应该是在时机1。
以下是调试输出:
[。。] "onReady ...07.png", source: qrc:/index.html (68)
[。。] "Build connection withs webchanenl...", source: qrc:/index.html (47)
即:在绑定业务对象到js对象之后即可调用业务对象的方法实现数据初始化。
(3)小结
QWebChannel初始化的第2个参数也是一个回调函数,并不是即时执行。
也就说 业务对象绑定 到 js对象 也不是及时执行,所以在 onready 时业务对象可能还没有绑定,从而造成调用业务对象的方法会报错。
所以,在 QWebChannel初始化回调函数 中调用业务对象的方法是最安全的。。