- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
使用 QWebChannel 从 QtWebKit 迁移到 QtWebEngine。
我有一个可调用函数,它向 Javascript 发送一个 QVariant 对象,它被视为一个 JSON 对象。所以 QString
变成了 string
,QInt
变成了 int
,等等。
在没有 QWebChannel 的情况下使用 QtWebKit,QByteArray 被视为 Uint8ClampedArray
,但现在使用 UTF-8 直接转换为 string
(我的 QByteArray 不是 :( )
我做错了什么吗?我该怎么办?
相关代码部分如下:
//Qt Window class signal to javascript
void MyWindow::uplink(Response msg)
{
emit _nativeToJs(msg->toJson());
}
//Response class toJson() method
QVariantMap Response::toJson() const
{
QVariantMap map;
map["id"] = m_id; //qulonglong
map["src"] = QString(m_src);
map["dst"] = QString(m_dst);
map["status"] = m_status; //qint16
map["result"] = m_result; //QVariant, can be a map of string, arrays, etc
return map;
}
//Javascript
var foo;
new QWebChannel(qt.webChannelTransport, function(channel) {
//we connect the signal
channel.objects.foo._nativeToJs.connect(function(msg){
//msg is now a JSON object
});
});
msg.result
应该包含我稍后解码的固定数组(msgpack 数据)。现在我有一个丑陋的 string
,它不是 UTF-8 字符,被解释为 UTF-8,我不能用它做任何事情。
最佳答案
根本不是答案,而是研究的开始,因为这是一个非常有趣的问题。
在 Qt 版本 < Qt5.6 中,您可以通过查看 Qt 源代码来了解转换是如何完成的。特别是,我在文件 C:\Qt\5.5\Src\qtwebkit\Source\WebCore\bridge\qt\qt_runtime.cpp
中找到了这个函数:
JSValueRef convertQVariantToValue(JSContextRef context, PassRefPtr<RootObject> root, const QVariant& variant, JSValueRef *exception)
以及其中的这段代码:
if (type == QMetaType::QByteArray) {
QByteArray qtByteArray = variant.value<QByteArray>();
WTF::RefPtr<WTF::Uint8ClampedArray> wtfByteArray = WTF::Uint8ClampedArray::createUninitialized(qtByteArray.length());
memcpy(wtfByteArray->data(), qtByteArray.constData(), qtByteArray.length());
ExecState* exec = toJS(context);
APIEntryShim entryShim(exec);
return toRef(exec, toJS(exec, static_cast<JSDOMGlobalObject*>(exec->lexicalGlobalObject()), wtfByteArray.get()));
}
这好像是在JS端对一个QByteArray
的处理。
我还相信,通过从 Qt WebKit 迁移到 Qt WebEngine,Qt 现在使用 V8 ,而之前是 WebCore and JavaScript Core (来源:this thread)。所以,事情可能已经改变,但我不知道改变到什么程度。
目前,我无法在 Qt 源代码中进一步搜索 Qt5.6,因此我无法提供真正的答案,但我希望这会激励您或其他任何人调查并澄清这种行为 :-)。
关于javascript - QByteArray 通过 QWebChannel 在 Javascript 中被视为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36934402/
无论好坏,我都在探索使用 QWebChannel 作为创建网络视频游戏的方法。我遇到了一个问题,当 new.clients 加入时,他们会收到最初的游戏状态,而没有其他客户端所做的任何增量更改。 查看
基于 QT QWebEnginePage::setWebChannel() transport object和 Qt: Cannot invoke shared object methods/prop
我有一个 QWebEngineView 加载类似 http://google.com 的页面我想将键盘加载到输入框,所以我应该使用 QWebChannel 和 WebEngineScript。我为 w
我正在使用 Qt 和 html 中的 UI 开发适用于 Android/iOs/Windows 的应用程序。当我尝试从我的 html 到 JavaScript 进行通信时,它很好,但是当我尝试从 JS
我有一个使用 QWebChannel 创建谷歌地图实例的小部件。在 javascript 中实例化 QWebChannel 时会出现几个警告: Property 'accessibleName'' o
我使用带有 WebChannel 的 QT 5 与 HTML 页面进行通信。我成功地能够传达文本和字符串。但是我想传达一些积分数据。 官方文档说 "No manual message passing
我正在使用新的 WebEngine 来玩耍和学习。我一直在尝试使用 Qt WebKit 找到一些类似的方法:addToJavaScriptWindowObject() 我发现使用Qt WebEngin
我已经通过 PyQt5 在 Python 中构建了一个 GUI。我正在展示一个带有谷歌地图页面的网络浏览器。用户应该移动标记,我的程序应该处理标记的坐标。因此我必须将坐标从 JS 传递到 Python
一旦 html 输入字段聚焦在显示 QWebEngineView 上,我想在触摸屏上显示自定义输入设备。 。因此我尝试通过 QWebChannel 公开输入设备对象到客户端 Javascipt,一旦输
使用 QWebChannel 从 QtWebKit 迁移到 QtWebEngine。 我有一个可调用函数,它向 Javascript 发送一个 QVariant 对象,它被视为一个 JSON 对象。所
我使用 QWebChannel 在 Qt 中实现了一个 HTML 包装器,并且我能够成功地发送字符串,但是,我想发送一个 QJsonObject,而不是像“{a:1,b:2}”这样的 json 字符串
QtWebEngine 使用 IPC 机制在 C+ Qt 世界和 JavaScript 工作之间进行通信。这种机制用于 QWebChannel,它似乎是基于 WebSockets 的。有没有一种方法可
我正在编写一个 C++ QWidget 应用程序,它与资源托管网页中运行的 JavaScript 进行通信。我需要找到一种方法将以下 POD 结构的数组发送到网页中托管的 JavaScript 函数,
由于 Qt 的文档远未完成,这是设置 QWebChannel 的方法以及与添加 不同的方法吗?像文档中推荐的那样在 HTML 页面中标记? 最佳答案 有不同的选项可以加载可在 URL qrc:///
我在我的应用程序和 WebEngine 之间创建了网络 channel ,以便在 JavaScript 中在网络端公开 QObject 但 channel 在页面重新加载后丢失,或者如果我单击链接到另
我是一名优秀的程序员,十分优秀!