QByteArray通过QWebChannel在Javascript中看作是一个String

时间:2016-04-29 09:19:00

标签: javascript qbytearray qtwebengine

使用QWebChannel从QtWebKit迁移到QtWebEngine。

我有一个可调用的函数,它将QVariant对象发送到Javascript,这被视为JSON对象。因此,QString变为stringQIntint等。

在没有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,我无法做任何事情。

1 个答案:

答案 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,因此我无法提供真正的答案,但我希望这会激励您或其他任何人研究它并澄清这种行为: - )。