【问题标题】:QByteArray seen as a String in Javascript via QWebChannelQByteArray 通过 QWebChannel 被视为 Javascript 中的字符串
【发布时间】:2016-08-24 09:10:58
【问题描述】:

使用 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,我对此无能为力。

【问题讨论】:

    标签: javascript qbytearray qtwebengine


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 2017-11-20
      • 1970-01-01
      • 2015-02-23
      • 2011-09-30
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多