Ответ 1
Не совсем ответ, а начало исследований, так как это очень интересный вопрос.
В версиях Qt < Qt5.6, вы можете найти, как преобразование выполняется путем изучения источников 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()));
}
который, по-видимому, является обработкой a QByteArray
на стороне JS.
Я также считаю, что, перейдя с Qt WebKit на Qt WebEngine, Qt теперь использует V8, тогда как раньше он был WebCore и JavaScript Core (источник: этот поток). Итак, все могло измениться, но я не знаю, в какой степени.
В настоящий момент я не могу искать дальше в Qt-источниках для Qt5.6, и поэтому я не могу дать реальный ответ, но я надеюсь, что это побудит вас или кого-либо еще изучить его и прояснить это: -).