是否可以从Qml中访问QScriptValue中的任何内容来保存QVariantMap?

时间:2014-09-25 09:39:00

标签: javascript c++ qt qml

您好我希望将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,一切都会正常工作

1 个答案:

答案 0 :(得分:1)

我不知道为什么,但将QScriptEngine::newVariant更改为QScriptEngine::toScriptValue解决了这个问题,因此我可以将jV对象作为js对象访问,而不是黑客攻击。