嗨,我想将javascript函数从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,则一切正常

最佳答案

我不知道为什么,但是将QScriptEngine::newVariant更改为QScriptEngine::toScriptValue可以解决问题,因此我可以将传递的QVariantMap作为js对象访问而不会受到黑客的攻击。

08-15 19:49