Qt脚本功能包装

时间:2012-09-07 10:22:43

标签: qt function

我正在阅读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做什么。如何在函数中设置值。

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

1 个答案:

答案 0 :(得分:7)

您已走上正轨。 QScriptEngine::newFunction()将函数引入引擎。现在,您需要一种从脚本访问此功能的方法。 “function”只是全局对象的属性,您可以使用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;

当您执行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