QByteArray通过QWebChannel在Javascript中被视为字符串
使用QWebChannel从QtWebKit迁移到QtWebEngine 我有一个可调用的函数,它将QVariant对象发送到Javascript,Javascript被视为JSON对象。因此,QByteArray通过QWebChannel在Javascript中被视为字符串,javascript,qbytearray,qtwebengine,Javascript,Qbytearray,Qtwebengine,使用QWebChannel从QtWebKit迁移到QtWebEngine 我有一个可调用的函数,它将QVariant对象发送到Javascript,Javascript被视为JSON对象。因此,QString变成了字符串,QInt和int,等等 使用不带QWebChannel的QtWebKit时,QByteArray被视为uint8clampedaray,但现在使用UTF-8(我的QByteArray不是:() 我做错什么了吗?我该怎么办 以下是相关代码部分: //Qt Window class
QString
变成了字符串
,QInt
和int
,等等
使用不带QWebChannel的QtWebKit时,QByteArray被视为uint8clampedaray
,但现在使用UTF-8(我的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数据),我稍后会对其进行解码。现在我有一个丑陋的字符串
,它不是UTF-8字符,我对此无能为力。根本不是答案,而是研究的开始,因为这是一个非常有趣的问题
在Qt版本C:\Qt\5.5\Src\qtwebkit\Source\WebCore\bridge\Qt\Qt\u runtime.cpp中找到了此函数:
JSValueRef convertQVariantToValue(JSContextRef context, PassRefPtr<RootObject> root, const QVariant& variant, JSValueRef *exception)
JSValueRef convertQVariantToValue(JSContextRef上下文,PassRefPtr根,const QVariant&variant,JSValueRef*异常)
里面的这段代码:
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()));
}
if(type==QMetaType::QByteArray){
QByteArray qtbytarray=variant.value();
WTF::RefPtr wtfByteArray=WTF::Uint8ClampedArray::createUninitialized(qtByteArray.length());
memcpy(wtfByteArray->data(),qtByteArray.constData(),qtByteArray.length());
ExecState*exec=toJS(上下文);
APIEntryShim entryShim(执行);
返回toRef(exec,toJS(exec,static_cast(exec->lexicalGlobalObject()),wtfByteArray.get());
}
这似乎是在JS端处理一个QByteArray
我还相信,通过从Qt WebKit迁移到Qt WebEngine,Qt现在可以使用了,而以前是(source:)。所以,事情可能已经发生了变化,但我不知道到了什么程度
目前,我无法在Qt源代码中进一步搜索Qt5.6,因此我无法提供真实的答案,但我希望这将激励您或任何其他人研究它并澄清此行为:-)