1

我正在浏览 Qt Scripting 的文档,如果指导文本错误,它会完全令人困惑和完整。有人可以用简单的英语解释如何包装一个函数并在包装后在脚本代码中访问它。我在下面包含了我的示例。包装函数。这是一个简单的包装器,我需要返回作为参数传递的字符串。以下是代码。

#include <QApplication>
#include <QtScript/QScriptEngine>
#include <QtScript/QScriptContext>
#include <QDebug>

QScriptValue returnProperty(QScriptContext *context , QScriptEngine *engine)
{
    qDebug() << "running returnValues Function "<< context->argument(0).toString();
    return context->thisObject().property("returnValue");
} 

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);
    QScriptEngine engine;
    //Evaluating a simple expression
    qDebug() << engine.evaluate("1+2").toNumber();

    QScriptValue func = engine.globalObject();
    func.setProperty("foo",engine.newFunction(returnProperty),QScriptValue::PropertyGetter);
    engine.evaluate("var v= foo('name') ; print( 'This prints values from addValues function :',v) ;");
}

输出如下

3
Running returnValues Function  "undefined" 

如果我正确理解这一点,这就是我应该做的,如果我调用 engine.newObject() ,因为它在 doc 函数中提到,甚至不会被调用。

我在这里没有得到的是,我在 func.setproperty 行中分配的属性是什么,一旦我设置了属性 foo 我可以做什么。如何在函数中设置值。

如果有人解释我在这里做错了什么,我将不胜感激。

4

1 回答 1

7

你已经在正确的轨道上。QScriptEngine::newFunction()将功能带入引擎。现在,您需要一种从脚本访问此函数的方法。“函数”只是全局对象的一个​​属性,您可以使用setProperty(). 编码

QScriptValue globalObject = engine.globalObject();
QScriptValue func = engine.newFunction(returnProperty);
globalObject.setProperty("foo", func);

产生输出

3
running returnValues Function  "name"
This prints values from addValues function : name

标志QScriptValue::PropertyGetterQScriptValue::PropertySetter仅在您要创建属性时才需要,该属性必须在访问时调用函数。它类似于 的属性QObject。考虑这个例子:

class MyObject : public QObject
{
   Q_PROPERTY(QString name READ getName WRITE setName)
};
MyObject* obj = new MyObject;

当您执行 a 时,您会在后台obj->setProperty("name", "Sam");调用并且是. 一个小例子:MyObject::setName("Sam")obj->getProperty("name")MyObject::getName()

QScriptValue getName(QScriptContext* ctx, QScriptEngine* eng)
{
     // Return the value of the internal '_name_' property.
     qDebug() << "Getter 'getName' called";
     return ctx->thisObject().property("_name_");
}

QScriptValue setName(QScriptContext* ctx, QScriptEngine* eng)
{
    // Do some processing and store the name in an internal '_name_' property. 
    qDebug() << "Setter 'setName' called";
    ctx->thisObject().setProperty("_name_", 
                                  ctx->argument(0).toString().toUpper());
    return QScriptValue::UndefinedValue;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QScriptEngine engine;
    QScriptValue globalObject = engine.globalObject();

    // Create a new object.
    QScriptValue obj = engine.newObject();
    // Bring the functions into the engine.
    QScriptValue getNameFunc = engine.newFunction(getName);
    QScriptValue setNameFunc = engine.newFunction(setName);
    // Create a 'name' property, which calls the getter and setter from above.
    obj.setProperty("name", getNameFunc, QScriptValue::PropertyGetter);
    obj.setProperty("name", setNameFunc, QScriptValue::PropertySetter);
    // Make the new object known as 'person'.
    globalObject.setProperty("person", obj);

    // Test our construct.
    engine.evaluate("print('Set the name to fitzgerald');");
    engine.evaluate("person.name = 'fitzgerald';");
    engine.evaluate("print('And the name is... ' + person.name)");
}

最后输出:

Set the name to fitzgerald
Setter 'setName' called 
Getter 'getName' called 
And the name is... FITZGERALD
于 2012-09-07T19:53:29.287 回答