QML开发避坑指南(三):webchannel中js的加载顺序

文章讲述了在QML与QWebEngineView集成中,通过QWebChannel进行JS与C++交互时遇到的问题。作者发现不能在页面DOM加载完成后(onready)调用业务对象的方法,而应在QWebChannel初始化的回调函数中调用,因为业务对象绑定到JS对象不是即时完成的。这个问题的解决有助于理解QWebChannel的工作机制并避免类似错误。
摘要由CSDN通过智能技术生成
(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个时机:

  1. WebChannel初始化(绑定业务对象到js对象)
  2. 页面加载完成(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初始化回调函数 中调用业务对象的方法是最安全的。。

相关文档
  1. QML开发避坑指南(一):图像资源的加载
  2. QML开发避坑指南(二):加载https图像
  3. QML开发避坑指南(四):ImageProvider的使用
  4. QML开发避坑指南(五):QML常用类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值