2013-02-25 12 views
2

(Qt 스크립트가 사용되지 않으므로) QJSEngine을 기반으로 Qt 5에서 javascript에 노출 된 C++ 클래스 집합이 있습니다.QJSEngine에 대한 사용자 정의 C++ 유형 : 멤버 함수 반환 값은 항상 QVariant입니다.

My QObject 파생 클래스 A와 B에는 Q_OBJECT 매크로가 있으며 Q_DECLARE_METATYPE 매크로도 사용됩니다.

javascript 내에서 새 인스턴스를 만들 수있는 클래스에 대한 팩토리 함수를 공개했습니다. 미세 다음의 모든 작품 :

a = namespace.createNewA(); // QJSEngine reports a type A object 
b = namespace.createNewB(); // QJSEngine reports a type B object 
b.SetParent(a); // SetParent is a slot of B taking a const A& parameter, gets called correctly 
// But now. 
b.GetParent(); // Reports QVariant(A), even though this is a slot: A GetParent() const 

나를 대신 QVariant의,의 getParent 자바 스크립트에서 실제 타입으로 객체를 인식됩니다 것을 보장하기위한 방법이 있나요?

답변

2

내 원래의 코드로 문제를 파악 : 리턴 값으로 Qt는 슬롯을 사용

  1. 아마 일반적인 경우에 좋은 생각이 아니다 (예를 들어, Qt: meaning of slot return value? 참조). Q_INVOKABLE로 함수를 변경했는데 실제로 결과를 변경하지는 않았지만 계속해서 더 안전한 곳으로 보였습니다.
  2. 값을으로 반환하는 것은 스크립팅/줄 바꿈에도 좋지 않은 것처럼 보입니다. 디버거로 코드를 파헤 칠 때 QVariant cast-to-qobject가 실패하고 전구가 끊어지는 것을 발견했습니다. by-value는 QObject 파생 형식을 조회하는 qobject_cast를 손상시킬 수 있습니다. 포인터를 QObject로 되돌리기 위해 호출을 변경 했으므로 이제 QJSEngine이 올바른 유형으로 객체를보고합니다.

반환 값이 임시로 사용되었으므로 코드 설정에 약간의 변경이 필요했지만 그걸로는 살 수 있습니다.

+0

QJSEngine에서 "newable"객체를 만든 방법을 공유 할 수 있습니까? 나는 지금 그것에 고심하고있다. 내가 찾은 모든 문서는 이전 엔진을 사용하여 설명합니다. – Jay