, 당신이 주위에 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)"두 번 인쇄 할 것입니다. 당신이 자바를 알고있는 경우,이 int
대 Integer
유사하다 (
자바 스크립트에서
이 모든 것이 객체이며, 당신은 단지참조 다루는 객체가 아닌 객체 자체됩니다 것으로 예상된다 동작은, 그 이유는). 따라서 result = anotherVar + 7;
지정이 수행하는 작업은 myvar
으로 표시되는 개체를 글로벌 개체의 "결과"속성으로 바꾸고 식 anotherVar + 7
의 결과 개체로 바꿉니다. 한편, QScriptValue myvar
은 여전히 (이전) 객체를 참조합니다. 그렇지 않은 경우이 시점에서 가비지 수집 자의 손에 꼽을 수 있습니다.
a=1
을 추가하여 문제를 해결할 수 있습니다. 여기에서 재현 할 수 없습니다. 첫 번째 디버그 문은 물론 a
의 값을 인쇄하지만 두 번째와 세 번째는 변경되지 않습니다.
그러므로 문제의 해결책은 필요할 때마다 (engine.globalObject().property("result")
을 사용하여) 항상 엔진에서 "result"속성을 다시 얻는 것입니다. 즉 QScriptValue가 assigments를 추적하지 않습니다. result.assign(anotherVal + 7);
와 함께 assign()
방법으로 사용자 정의 클래스로 result
를 구현하고, 할당 (=
를) 대체 :
당신이이 할당을 추적하고자 할 경우
, 당신은 메서드 호출로 돌려해야합니다.
저의 작품 :'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)"을 출력합니다. –
변수 QScriptValue (1.0)을 만들고 엔진의 값을 읽는 대신이 변수의 값을 표시 할 수 있습니까? (예 : globalObject(). property ("result"). toVariant()). 감사. – JFM