gpt4 book ai didi

javascript - 如何以独立于平台的方式在 Qt WebChannel 中的 HTML/Javascript 和 C++ 之间进行通信?

转载 作者:太空狗 更新时间:2023-10-29 21:11:34 28 4
gpt4 key购买 nike

对于桌面(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 从 Javascript 调用 C++ 的方式使用 channel.objects 非常方便,我想保留这种方式。]

最佳答案

通过 QWebChannel 在 C++ 和 HTML/JS 之间进行通信,Qt 目前使用 JSON 来传输事件调用/数据(参见 QWebChannelAbstractTransportQWebChannel.js)。在互联网上,与 Google Protobuf 相比,JSON 可能会产生发送字段名称的开销,但与任一协议(protocol)中的“无数据(字符串/文本)优化”相比,这应该可以忽略不计。

在 Qt 中从 C++ 调用 HTML/Javascript 是否有任何优化的和平台不可知的方法?

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

变通/替代解决方案(可能不是优化方式)是使用当前抽象来使用 Protobuf/自定义协议(protocol)进行传输,如下所示:

引用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使用了socket,需要根据需要将socket设置为binary或text,并根据Qt的需要将ProtoBuf/自定义协议(protocol)消息转为json

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

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

JS -> (QWebChannel.js) -> websocket JS (JSON to Protobuf/custom protocol) -> transmit -> WebSocketTransport (Protobuf/custom protocol to JSON) -> C++

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

关于javascript - 如何以独立于平台的方式在 Qt WebChannel 中的 HTML/Javascript 和 C++ 之间进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50375762/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com