通过QWebChannel,将QByteArray在Javascript中视为字符串

12

从QtWebKit迁移到QtWebEngine,使用QWebChannel。

我有一个可调用的函数将QVariant对象发送到Javascript,它被视为JSON对象。因此,QString变成了stringQInt变成了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数据),我稍后会对其进行解码。现在我有一个丑陋的 字符串,其中包含了不是UTF-8字符但被解释为UTF-8,我无法使用它。

1个回答

1
不是答案,而是一项研究的开始,因为这是一个非常有趣的问题。
在Qt版本
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和JavaScript Core(来源:this thread)。因此,事情可能已经发生了变化,但我不知道到什么程度。

目前,我无法在Qt5.6的源代码中进一步搜索,因此无法提供真正的答案,但我希望这会激励您或其他人去研究并澄清这种行为 :-)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接