QByteArray рассматривается как строка в Javascript через QWebChannel
Миграция из QtWebKit в QtWebEngine с использованием QWebChannel.
У меня есть вызываемая функция, которая отправляет объект QVariant в Javascript, который рассматривается как объект JSON. Так что QString
становится string
, QInt
int
, так далее.
Используя QtWebKit без QWebChannel, QByteArray рассматривался как Uint8ClampedArray
, но теперь напрямую преобразуется в string
используя 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), который я позже расшифрую. Теперь у меня некрасивый string
из не UTF-8 символов, интерпретируемых как UTF-8, с которыми я ничего не могу сделать.
1 ответ
Не ответ вообще, но начало исследования, поскольку это очень интересный вопрос.
В версиях 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()));
}
которая кажется обработкой QByteArray
на стороне JS.
Я также считаю, что при переходе с Qt WebKit на Qt WebEngine Qt теперь использует V8, тогда как раньше это были WebCore и JavaScript Core (источник: этот поток). Так что все могло измениться, но я не знаю, в какой степени.
В настоящее время я не могу искать дальше в источниках Qt для Qt5.6, и поэтому я не могу дать реальный ответ, но я надеюсь, что это побудит вас или кого-либо еще изучить его и прояснить это поведение:-).