1

私はQtScriptingのドキュメントを調べていますが、テキストを誤ってガイドすると、完全に混乱し、完全になります。関数をラップし、ラップ後にスクリプトコードでアクセスする方法を簡単な英語で説明してください。以下に私の例を含めました。ラッパー関数。これは単純なラッパーであり、パラメーターとして渡された文字列を返す必要があります。以下はコードです。

#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" 

私がこれを正しく理解している場合、これは私がすべきことであり、doc関数で言及されているようにengine.newObject()を呼び出すと、呼び出されることさえありません。

ここで得られないのは、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;

を行うと、バックグラウンドで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 に答える