使用QWebChannel从QtWebKit迁移到QtWebEngine。
我有一个可调用的函数,它将QVariant对象发送到Javascript,这被视为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,我无法做任何事情。
答案 0 :(得分:1)
根本不是答案,而是研究的开始,因为这是一个非常有趣的问题。
在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,因此我无法提供真正的答案,但我希望这会激励您或其他任何人研究它并澄清这种行为: - )。