您好我希望将qavascript函数传递给来自qml的c ++代码,然后调用它,但坚持使用QScriptValue持有QVariantMap,它不想从javascript访问。我是否以正确的方式做所有事情,我可以在没有黑客的情况下做我想做的事吗?我使用的是QtQuick1.1和Qt 5.5.0。
我的c ++类有方法:
void SomeClass::setQmlCallback(const QScriptValue &fn)
{
QScriptValue scriptFn = fn;
QScriptValueList args;
QVariantMap m;
m.insert(QStringLiteral("a"), 96);
m.insert(QStringLiteral("b"), 97);
args << scriptFn.engine()->newVariant(m); // To pass VariantMap to qml I wrap it in ScriptValue
scriptFn.call(scriptFn, args);
}
和一些qml代码:
onSomethingHappend: {
SomeClass.setQmlCallback(function(row) {
// console.log(row.a); // NotOk
// row's key `a` is undefined here
var convertedToVariant = SomeClass.convertToVariant(row);
console.log(convertedToVariant.a); // Ok
});
}
Hack将ScriptValue显式转换为Variant:
QVariant SomeClass::convertToVariant(const QVariant &v)
{
return v;
}
此外,如果我将传递QString而不是QVariantMap,一切都会正常工作
答案 0 :(得分:1)
我不知道为什么,但将QScriptEngine::newVariant
更改为QScriptEngine::toScriptValue
解决了这个问题,因此我可以将jV对象作为js对象访问,而不是黑客攻击。