2011-04-20 3 views
1

C++ 측에서 간단한 스크립트 작업 결과를 얻으려고합니다.QtScript의 변수 영향 문제

QScriptValue (myvar)를 만들고 engine.globalObject().setProperty("result", myvar); 을 호출합니다. 그런 다음 "result = anothervar + 7;"을 평가합니다. evaluate 메소드의 반환 값은 OK이지만 변수 result는 OK가 아닙니다. 스크립트가 "result = anothervar + 7; a = 1"이면 결과 값은 OK입니다.

Qt 버그가 너무 어리석게 보입니다. 그래서 나는 무엇을 놓쳤습니까?

감사

제프 내 댓글에 대한 답변에서

+0

저의 작품 :'QScriptEngine e; 예 : globalObject(). setProperty ("result", QScriptValue (1.0)); ; 예 : globalObject(). setProperty ("anotherVar", QScriptValue (14)); ; const QScriptValue s = e.evaluate ("result = anotherVar + 7;"); qDebug() << s.toVariant(); qDebug() << 예를 들어 globalObject(). 속성 ("결과"). toVariant();'모두 "QVariant (double, 21)"을 출력합니다. –

+0

변수 QScriptValue (1.0)을 만들고 엔진의 값을 읽는 대신이 변수의 값을 표시 할 수 있습니까? (예 : globalObject(). property ("result"). toVariant()). 감사. – JFM

답변

0

, 당신이 주위에 QScriptValue myvar 인스턴스를 유지하고 가정 및 evaluate()를 호출 한 후 그것을보고있어 :

QScriptEngine e; 
QScriptValue myvar(1.0); 
e.globalObject().setProperty("result", myvar); 
e.globalObject().setProperty("anotherVar", QScriptValue(14)); 
const QScriptValue s = e.evaluate("result = anotherVar + 7;"); 
qDebug() << s.toVariant(); 
qDebug() << e.globalObject().property("result").toVariant(); 
qDebug() << myvar.toVariant(); 

이를 "QVariant (double, 21)"와 "QVariant (double, 1)"두 번 인쇄 할 것입니다. 당신이 자바를 알고있는 경우,이 intInteger 유사하다 (

자바 스크립트에서

이 모든 것이 객체이며, 당신은 단지참조 다루는 객체가 아닌 객체 자체됩니다 것으로 예상된다 동작은, 그 이유는). 따라서 result = anotherVar + 7; 지정이 수행하는 작업은 myvar으로 표시되는 개체를 글로벌 개체의 "결과"속성으로 바꾸고 식 anotherVar + 7의 결과 개체로 바꿉니다. 한편, QScriptValue myvar은 여전히 ​​(이전) 객체를 참조합니다. 그렇지 않은 경우이 시점에서 가비지 수집 자의 손에 꼽을 수 있습니다.

a=1을 추가하여 문제를 해결할 수 있습니다. 여기에서 재현 할 수 없습니다. 첫 번째 디버그 문은 물론 a의 값을 인쇄하지만 두 번째와 세 번째는 변경되지 않습니다.

그러므로 문제의 해결책은 필요할 때마다 (engine.globalObject().property("result")을 사용하여) 항상 엔진에서 "result"속성을 다시 얻는 것입니다. 즉 QScriptValue가 assigments를 추적하지 않습니다. result.assign(anotherVal + 7);와 함께 assign() 방법으로 사용자 정의 클래스로 result를 구현하고, 할당 (=를) 대체 :

당신이이 할당을 추적하고자 할 경우

, 당신은 메서드 호출로 돌려해야합니다.

+0

당신이 맞습니다, a = 1은 아무것도 고치지 않습니다, 나는이 결과를 꿈꿔야합니다! "QScriptValue myvar를 통해 myvar에 의해 표현 된 객체를 고수하지 않으면이 시점에서 가비지 수집됩니다"에 관한 설명을 이해할 수 없습니다. 그 문제를 해결하기위한 귀하의 조언은 무엇입니까? – JFM

+0

@JFM : 필자는 두 가지 점에서 (잘하면) 더 명확하게 대답을 편집했다. –

+0

좋아,이 대답을 두려워했다 ... 나는 많은 스크립트에서 접근 가능한 많은 변수를 가지고 있지만 모든 변수가 모든 스크립트에서 수정되지는 않는다. 모든 변수에 대한 값을 얻지 않으려했습니다. 사용자 지정 클래스를 만들면 QScriptValues를 대체하면 동일한 동작을 얻지 만 더 나은 의견을 코딩 할 수 있습니까? qScriptRegisterMetaType을 통해 (엔진, toScriptValue, fromScriptValue); ? – JFM