ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在Qt WebChannel中以平台无关的方式在HTML / Javascript和C之间进行通信?

2019-11-09 01:45:46  阅读:325  来源: 互联网

标签:qwebview html javascript c-4 qt


对于台式机(Windows,Mac,Ubuntu),有一个QWebEngineView;对于手机(Android,iOS),有一个本机QWebView.

不幸的是mobiles don’t support QWebEngineView.
例如,如下文所述:
How to use Qt WebEngine and QWebChannel?
setWebChannel()在QWebEnginePage中可用,仅在QWebEngineView中可以访问.但是,QWebPage没有在QWebView中可以访问的方法.

现在,存在另一种独立于平台的方式,该方式适用于所有平台,如Integrating Web Content所述.
但是该示例使用QWebChannelAbstractTransport,该属性只能与JSON一起使用.现在,如果C模块位于服务器中的某个位置并且HTML是本地的,则由于JSON的过度描述性质,它可能会非常昂贵.即通过互联网进行的真实的客户端-服务器通信.
如果他们使用protobuf,那就更好了.

有没有在Qt中从C调用HTML / Javascript的优化且与平台无关的方法?

[注意:顺便说一句,当前的Qt从Java脚本调用C的方法非常方便使用channel.objects,我想保留这种方法.

解决方法:

利用QWebChannel在C和HTML / JS之间进行通信,Qt当前使用JSON传输事件调用/数据(请参阅QWebChannelAbstractTransport& QWebChannel.js).在互联网上,与Google Protobuf相比,JSON可能会增加发送字段名称的开销,但是与两种协议中的“无数据(字符串/文本)优化”相比,这应该可以忽略不计.

有没有在Qt中从C调用HTML / Javascript的优化且与平台无关的方法?

优化的方法是让Qt在QWebChannelAbstractTransport和JS(两个连接端)中提供字符串/字节(而不是QJsonObject),以便我们可以使用自定义协议进行传输.

解决方法/替代解决方案(可能不是最佳方法)将是使用Protobuf /自定义协议使用当前抽象进行传输,如下所示:

参考Qt WebChannel Examples

    In websockettransport.cpp (shared folder in examples)
        C++

        void WebSocketTransport::sendMessage(const QJsonObject &message)
        // Convert message from QJsonObject to Protobuf/custom protocol and
        // use m_socket->sendTextMessage or sendBinaryMessage as required


        void WebSocketTransport::textMessageReceived(const QString &messageData)
        //with QWebSocket::binary[ or text]MessageReceived slot, 
        //convert the message from client (in Protobuf/custom protocol) to 
        //JSON and still
        emit messageReceived(message.object(), this); 

JS:
同样,由于QWebChannel.js使用套接字,因此需要根据需要将套接字设置为二进制或文本,并根据Qt的要求将ProtoBuf /自定义协议消息转换为json.

在QWebchannel中使用Protobuf(需要预定义所有消息)/自定义协议的简单说明:

C-> WebSocketTransport(JSON到Protobuf /自定义协议)->传送-> websocket JS(Protobuf / JSON的自定义协议)-> (QWebChannel.js)

JS-> (QWebChannel.js)-> websocket JS(JSON到Protobuf /自定义协议)->传送-> WebSocketTransport(Protobuf / JSON的自定义协议)-> C

注意:JS适用于对象(来自JSON或任何协议),并且可能不需要如上所述的转换.但这需要确定.

标签:qwebview,html,javascript,c-4,qt
来源: https://codeday.me/bug/20191109/2010984.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有