gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:12:34 26 4
gpt4 key购买 nike

使用 QWebChannel 从 QtWebKit 迁移到 QtWebEngine。

我有一个可调用函数,它向 Javascript 发送一个 QVariant 对象,它被视为一个 JSON 对象。所以 QString 变成了 stringQInt 变成了 int,等等。

在没有 QWebChannel 的情况下使用 QtWebKit,QByteArray 被视为 Uint8ClampedArray,但现在使用 UTF-8 直接转换为 string(我的 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,我不能用它做任何事情。

最佳答案

根本不是答案,而是研究的开始,因为这是一个非常有趣的问题。

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

这好像是在JS端对一个QByteArray的处理。

我还相信,通过从 Qt WebKit 迁移到 Qt WebEngine,Qt 现在使用 V8 ,而之前是 WebCore and JavaScript Core (来源:this thread)。所以,事情可能已经改变,但我不知道改变到什么程度。

目前,我无法在 Qt 源代码中进一步搜索 Qt5.6,因此我无法提供真正的答案,但我希望这会激励您或其他任何人调查并澄清这种行为 :-)。

关于javascript - QByteArray 通过 QWebChannel 在 Javascript 中被视为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36934402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com