由于qt文档在QJSValue上,QJsonObject不能隐式转换为QJSValue,我想从C++调用一个带有QJSEngine的javascript函数,参数应该通过QList<QJsValue>传递,以调用另一个保存函数本身的QJSValue的函数。
问题是我的一个参数是QJsonObject,直到现在我应该将它转换为文本,然后调用并将其传递给javascript函数,该函数调用JSON.parse将其转换为object,我正在寻找一个解决方案,允许我在C++中将QJsonObject转换为QJSValue,并使用对象参数调用javascript函数,而不是json文本。
目前的代码类似于下面的代码
QJsonObject obj;
obj["1"] = QString("A");
obj["2"] = QString("B");
QJSValue func = myEngine.evaluate("(function(arg) { var obj = JSON.parse(arg); var res = obj[\"1\"] + obj[\"2\"]; return res; })");
QJSValueList args;
args << QString(QJsonDocument(obj).toJson());
QJSValue res = func.call(args);我希望有一个像QJSValue ConvertToQJSValue(QJsonObject object)这样的函数,如下所示:
QJsonObject obj;
obj["1"] = QString("A");
obj["2"] = QString("B");
QJSValue func = myEngine.evaluate("(function(arg) { var res = arg[\"1\"] + arg[\"2\"]; return res; })");
QJSValueList args;
args << ConvertToQJSValue(obj);
QJSValue res = func.call(args);发布于 2018-07-03 15:16:37
我也遇到过类似的问题。我开始沿着从QJsonValue递归遍历树并从中构建QJSValue的道路走下去。
QJSValue Convert(QJSEngine* engine, const QJsonValue& val)
{
if (val.isBool())
{
return QJSValue(val.toBool());
}
else if (val.isString())
{
return QJSValue(val.toString());
}
else if (val.isDouble())
{
return QJSValue(val.toDouble());
}
else if (val.isNull())
{
return QJSValue(QJSValue::NullValue);
}
else if (val.isUndefined())
{
return QJSValue(QJSValue::UndefinedValue);
}
else if (val.isObject())
{
QJsonObject obj = val.toObject();
QJSValue newobj = engine->newObject();
for (auto itor = obj.begin(); itor != obj.end(); itor++)
{
QString key = itor.key();
QJsonValue value = itor.value();
QJSValue convertedValue = Convert(engine, value);
newobj.setProperty(key, convertedValue);
}
return newobj;
}
else if (val.isArray())
{
QJsonArray arr = val.toArray();
QJSValue newobj = engine->newArray(arr.size());
for (int i = 0; i < arr.size(); i++)
{
QJsonValue value = arr[i];
QJSValue convertedValue = Convert(engine, value);
newobj.setProperty(i, convertedValue);
}
return newobj;
}
// ASSERT(FALSE && "This shouldn't happen");
return QJSValue(QJSValue::UndefinedValue);
}在上面的代码中,您可以传递QJsonObject或任何其他类型的JSON节点以转换为QJSValue。
我目前使用的是更接近您原始解决方案的方法--只需从引擎调用JSON.parse即可:
QJSValue func = engine->evaluate("JSON.parse");
QJSValueList args;
args.append(jsonText); // jsonText is a QString or QJSValue string
QJSValue result = func.call(args);
return result;发布于 2018-04-05 08:01:39
可以使用toScriptValue()将单个QJsonObject值转换为QJSValue,然后将它们连接到QJSValueList。并调用func将它们追加到一个QJSValue中。
QJSEngine myEngine;
QJsonObject obj;
obj["1"] = QString("A");
obj["2"] = QString("B");
obj["3"] = QString("C");
QJSValue func = myEngine.evaluate("(function() {var args = Array.prototype.slice.call(arguments); var res='';for(i=0; i<args.length; i++) {res += args[i]}; return res})");
QJSValueList args;
for (int i=0 ; i < obj.size(); i++){
args << myEngine.toScriptValue(obj.value(obj.keys().at(i)));
}
QJSValue res = func.call(args);我不确定这是否是您应该做的正确的事情,因为您可以直接将QJSValue作为对象获取,
QJSValue res = myEngine.newObject();
for (int i=0; i<args.length(); i++){
res.setProperty(i,args[i]);
}或QJSValue数组:
QJSValue objArray = myEngine.newArray(args.length());
for (int x=0; x< args.length();x++){
objArray.setProperty(x,args[x]);
}https://stackoverflow.com/questions/49658551
复制相似问题