2016-08-22 11 views
0

Qt 4.8, C++ 측에서 의 국부 값을 QScriptValue으로 설정할 수 있습니까? 그 출력이 될평가하기 전에 QScriptValue-local 값 설정

QScriptEngine engine; 
engine.globalObject().setProperty("glob", 1000); 

// ???: Set loc to, say, 42. 
QScriptValue expr1 = engine.evaluate("glob + loc"); 
qDebug() << expr1.toNumber(); 

// ???: Set loc to, say, 99. 
QScriptValue expr2 = engine.evaluate("glob + loc"); 
qDebug() << expr2.toNumber(); 

그리고 내가 좋아하는 것 : 예를 들어

,의 내가 있다고 가정 해 봅시다

1042 
1099 

인위적인 예에 ​​대한 확실한 해결책은 위의 단지 수 있도록하는 것입니다 "loc"global을 설정하고 적절하게 재설정합니다. 그러나이 질문에서주의를 산만하게 만드는 이유는 내가 찾고있는 것이 아닙니다. 내가 좋아하는 것 :

  • "LOC는"인위적으로 예에 의해 스크립트 문자열을 수정하지 않으려면 각 QScriptValue
  • 로컬로 앞에 QString().sprintf("loc = %d;", 42) 또는 무엇이든 스크립트에 붙어 있습니다.
  • QScriptEngine 하나만 사용하십시오.

    QScriptValue expr1 = engine.evaluate("glob + loc"); 
    expr1.setProperty("loc", 42); 
    qDebug() << expr1.toNumber(); 
    

    그러나 값이 이미 완전히 evaluate()에 의해 평가되고 그래서 setProperty() 아무런 효과 (가 놀람을)이없는 것 같다 : 정말 시도하는 생각할 수

있는 유일한 방법이었다.

나는 또한 프로그램 로컬 환경을 제공하기를 희망하면서 QScriptProgram에 엿보기를 보았습니다.

내가 워드 프로세서보고, 나는이 게시 후에 보는 것입니다, 그러나 이것은 내가 QScriptEngine을 사용하고 처음으로 내가 내 뇌가 박쥐 우산으로 돌고 인정해야한다, 그래서 그것이 바로 거기에 있고 완전히 명백한 경우에 사과하십시오. RTFM을 유효한 대답으로 받아 들일 것입니다.

답변

0

내가 알아 낸 것은 적어도 이것이 최선의 방법이라고 생각합니다. 열쇠는 QScriptEngine#pushContext()#popContext()입니다 :

QScriptEngine engine; 
engine.globalObject().setProperty("glob", 1000); 

QScriptContext *local; 

local = engine.pushContext(); 
local->activationObject().setProperty("loc", 42);  
QScriptValue expr1 = engine.evaluate("glob + loc"); 
engine.popContext(); 

qDebug() << expr1.toNumber(); 

local = engine.pushContext(); 
local->activationObject().setProperty("loc", 99);  
QScriptValue expr2 = engine.evaluate("glob + loc"); 
engine.popContext(); 

qDebug() << expr2.toNumber(); 

그리고 한 주어진 QScriptContext가 스택에 활성화되어있는 모든 QScriptValue 평가 그것을 사용합니다. 동일한 이름의 기존 변수는 후속 컨텍스트에 의해 무시됩니다.

같아요주의해야 할 점은 여러 스레드와 하나 개의 엔진려고하는 경우에 당신이 푸시 → 모든 평가 → 팝 원자보다는 개별 평가를 확인해야합니다. 문맥을 evaluate()에 전달하는 방법이 있었으면 좋겠습니다.