Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QByteArray通过QWebChannel在Javascript中被视为字符串_Javascript_Qbytearray_Qtwebengine - Fatal编程技术网

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

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

使用QWebChannel从QtWebKit迁移到QtWebEngine

我有一个可调用的函数,它将QVariant对象发送到Javascript,Javascript被视为JSON对象。因此,
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,因此我无法提供真实的答案,但我希望这将激励您或任何其他人研究它并澄清此行为:-)