编程语言
首页 > 编程语言> > 如何在Qt WebChannel中以平台无关的方式在HTML / Javascript和C之间进行通信?

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

作者:互联网

对于台式机(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