1

我可以访问QObject传递给 a 的 s 的属性QJSEngine,但为什么我不能访问动态属性?

auto myObject = new MyObject(); // Contains a single property 'myProp'.

QJSEngine engine;

auto scriptMyObject = engine.newQObject( myObject );
engine.globalObject().setProperty( "myObject" , scriptMyObject );

engine.evaluate( "myObject.myProp = 4.2" );
cout << engine.evaluate( "myObject.myProp" ).toNumber() << endl;

myObject->setProperty( "newProp", 35 );
cout << myObject->property( "newProp" ).toInt() << endl;

cout << engine.evaluate( "myObject.newProp" ).toInt() << endl;

回报:

4.2
35
0

使用 Qt 5.2。

4

1 回答 1

1

似乎它可能是 QML 中的错误。如果您改用 QScriptEngine,问题似乎就消失了,

#include <QScriptEngine>
#include <QCoreApplication>
#include <QDebug>

int main(int a, char *b[])
{
    QCoreApplication app(a,b);
    auto myObject = new QObject;
    QScriptEngine engine;

    auto scriptMyObject = engine.newQObject( myObject );

    myObject->setProperty( "newProp", 35 );
    engine.globalObject().setProperty( "myObject" , scriptMyObject );
    qDebug() << myObject->property( "newProp" ).toInt();
    qDebug() << engine.evaluate( "myObject.newProp" ).toInteger();
    qDebug() << engine.evaluate( "myObject.newProp = 45" ).toInteger();
    qDebug() << myObject->property( "newProp" ).toInt();
    qDebug() << " -------- ";
    // still can't create new properties from JS?
    qDebug() << engine.evaluate( "myObject.fancyProp = 30" ).toInteger();
    qDebug() << myObject->property("fancyProp").toInt();

    return 0;
}

结果是

35
35
45
45
 -------- 
30
0

因此,这看起来像是 QJSEngine 中的一个错误,因为行为与 QScriptEngine 不同。

于 2014-04-08T05:12:45.927 回答