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

her*_*ass 12 javascript qbytearray qtwebengine

使用QWebChannel从QtWebKit迁移到QtWebEngine.

我有一个可调用的函数,它将QVariant对象发送到Javascript,它被视为JSON对象.因此,一个QString变成了string,一个QInt一个int,等等.

在没有QWebChannel的情况下使用QtWebKit,QByteArray被视为a Uint8ClampedArray,但现在直接转换为string使用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
    });
});
Run Code Online (Sandbox Code Playgroud)

msg.result应该包含一个后来解码的钳位数组(msgpack数据).现在我有一个丑陋string的UTF-8字符解释为UTF-8,我无法做任何事情.

IAm*_*PLS 1

根本不是答案,而是研究的开始,因为这是一个非常有趣的问题。

在 Qt5.6 以下的 Qt 版本中,您可以通过查看 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)
Run Code Online (Sandbox Code Playgroud)

以及其中的这段代码:

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()));
}
Run Code Online (Sandbox Code Playgroud)

这似乎是QByteArrayJS端对a的处理。

我还相信,通过从 Qt WebKit 迁移到 Qt WebEngine,Qt 现在使用V8,而之前是WebCore 和 JavaScript Core(来源:此线程)。所以,事情可能已经改变了,但我不知道改变到什么程度。

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