2016-04-29 4 views
12

Migration von QtWebKit zu QtWebEngine mit QWebChannel.QByteArray als String in Javascript über QWebChannel gesehen

Ich habe eine aufrufbare Funktion, die ein QVariant-Objekt an das Javascript sendet, das als JSON-Objekt angesehen wird. So ein QString wird eine string, ein QInt ein int usw.

Mit QtWebKit ohne QWebChannel, ein QByteArray als Uint8ClampedArray gesehen wurde, aber jetzt direkt umgewandelt in eine string UTF-8 verwenden (was meine QByteArray nicht ist:()

Habe ich etwas falsch gemacht Was soll ich tun

Hier ist der relevante Code Teil:?

//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 sollte ein geklammertes Array (msgpack data) enthalten, das ich später decodiere. Jetzt habe ich eine hässliche string von nicht UTF-8 Zeichen interpretiert als UTF-8, mit dem ich nichts machen kann.

Antwort

1

Keine Antwort, aber ein Anfang der Forschung, da es eine sehr interessante Frage ist.

In den Qt-Versionen < Qt5.6 können Sie nachschauen, wie die Konvertierung durchgeführt wird, indem Sie in Qt-Quellen suchen. Insbesondere fand ich diese Funktion in der Datei 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) 

und dieses Stück Code im Inneren:

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())); 
} 

, die die Bearbeitung eines QByteArray auf der JS Seite zu sein scheint.

Ich glaube auch, dass Qt WebEngine von Qt WebKit durch die Migration, Qt verwendet nun V8, während es vorher war WebCore and JavaScript Core (Quelle: this thread). Also, die Dinge könnten sich geändert haben, aber ich weiß nicht, in welchem ​​Ausmaß.

Im Moment kann ich nicht weiter in den Qt-Quellen nach Qt5.6 suchen, und daher kann ich keine wirkliche Antwort geben, aber ich hoffe, dass dies Sie oder irgendjemanden dazu motiviert, sich damit zu befassen verdeutliche dieses Verhalten :-).

Verwandte Themen