2016-04-29 3 views
12

QWebChannelを使用してQtWebKitからQtWebEngineに移行します。QWebChannel経由でJavascriptで文字列として認識されるQByteArray

QVariantオブジェクトをJavascriptに送信する呼び出し可能な関数があります。これはJSONオブジェクトとみなされます。私QByteArrayがされていない(QStringstringなるように、QWebChannelなしQtWebKitを使用するなどQIntint

は、QByteArrayはUint8ClampedArrayと見られていたが、現在は直接UTF-8を使用してstringに変換されます。 ()

私が何か間違ったことをしました、私はここで

何をすべき関連するコードの一部です:??を

//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

非常に興味深い質問であるため、全くの回答ではなく、研究の始まりです。

Qtバージョン< Qt5.6では、Qtソースを調べることによってどのように変換が行われているかを知ることができます。

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の処理と思わ特に、私は、ファイルC:\Qt\5.5\Src\qtwebkit\Source\WebCore\bridge\qt\qt_runtime.cppでこの機能を発見しました。

Qt WebKitからQt WebEngineに移行すると、Qtは現在V8を使用していましたが、それ以前はWebCore and JavaScript Core(ソース:this thread)でした。だから、物事は変わったかもしれないが、私はどれくらい知っているのか分からない。

現時点では、Qt5.6のQtソースをさらに検索することができないため、本当の回答は得られませんが、これがあなたや他の誰かに目を向けてくれることを願っています。この動作を明確にします:-)。

関連する問題