6

Qt 4.8 のスクリプト エンジンでは、「ローカル」変数は、からを取得し、そのアクティベーション オブジェクトのプロパティを設定するQScriptContextQScriptEngine::pushContextことで設定できます。これは、push/pop 呼び出し内でのみ実行できます。これは、a が使用できる唯一の場所QScriptContextであり、AFAICT には環境として使用するQScriptEngine#evaluateaに相当するものがないためです。QScriptContext

QScriptEngine engine;
QScriptContext *local;

local = engine.pushContext();
local->activationObject().setProperty("value", 2); // set value=2
qDebug() << engine.evaluate("value").toNumber(); // outputs 2
engine.popContext();

プッシュ/ポップ呼び出し以外の評価で使用する環境を維持する方法はありますか? たとえばQScriptValue、アクティベーション オブジェクトとして使用する を作成してから、次のように設定しようとしました。

QScriptEngine engine;
QScriptContext *local;

// Use ao as activation object, set variables here, prior to pushContext.
QScriptValue ao;
ao.setProperty("value", 1);

// Test with ao:
local = engine.pushContext();
local->setActivationObject(ao);
qDebug() << engine.evaluate("value").toNumber();
engine.popContext();

しかし、それはうまくいきません。未定義であるため、nanの代わりに出力します。何らかの理由で値を変更しませんでした。1valuesetActivationObject

私の一般的な目標は次のとおりです。

  1. 評価コードの外部にローカル環境をセットアップします。
  2. pushContext次に、とのpopContext呼び出しの間でスクリプトを評価するときに、その環境内のすべての変数を毎回再設定する必要なく、その事前構成されたローカル環境を使用します。

そう:

  • これを行う方法はありますか?
  • 正しい軌道に乗っているのに、セットアップがao不適切である可能性はありますか? たとえば、QScriptEngine#newActivationObject()使用すると「実装されていない」エラーが発生する文書化されていないものがありますが、これはヒントでしょうか?

ローカル コンテキストを設定する方法はありますが、基本的にコンテキストをプッシュするたびに再構成する必要はありません (コンテキストをポップするたびに本質的に失われるため)。

4

1 に答える 1

2

グローバルオブジェクトを使用できます。すべての評価でプロパティ値を共有します。

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

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QScriptEngine engine;

    engine.globalObject().setProperty("value", 2);
    engine.globalObject().setProperty("value2", 3);

    qDebug() << engine.evaluate("value").toNumber(); // outputs 2
    qDebug() << engine.evaluate("value2").toNumber(); // outputs 3


    return a.exec();
}

または、グローバルスコープが必要ない場合:

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

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QScriptEngine engine;
    QScriptContext *context;

    QScriptValue scope = engine.newObject();
    scope.setProperty("value", 1);
    scope.setProperty("value2", 2);

    context = engine.pushContext();

    context->pushScope(scope);
    qDebug() << engine.evaluate("value").toNumber(); // outputs 1
    qDebug() << engine.evaluate("value2").toNumber(); // outputs 2

    engine.popContext();

    return a.exec();
}
于 2016-08-31T14:51:07.977 に答える