2011-10-27 8 views
2

Lightクラスは、QObjectから継承するTransformクラスを継承しています。 TransformクラスにはPoint3(QVector3Dのtypedef)を返すcenter()関数があります。私はlightオブジェクトに対してinvokeMethodを呼び出そうとしていますが、不正な戻り値を取得しています。私は関数を間違って呼び出していますか?Qt:継承されたスーパークラスからのinvokemethodからの不正な戻り値

QObject* obj = qobject_cast<QObject*>(lObj); 

std::cout << lObj->center() << std::endl; 

QVector3D retVal; 
QMetaObject::invokeMethod(obj, "center", 
             Qt::DirectConnection, 
             Q_RETURN_ARG(QVector3D, retVal)); 

std::cout << retVal << std::endl; 

、ここでは、私は何を得るのです...

(0,10,0) // from lObj->center() 
(0,0,0) // from invokeMethod(...) 

はここPoint3とのtypedefを登録する

typedef QVector3D Point3; 

class Transformable : public QObject 
{ 
    Q_OBJECT 
    Q_INVOKABLE Point3    center() { return _center; } 
    ... 
}; 

class Light : public Transformable, public Entity // Entity is a non-Qt-related class 
{ 
}; 

class PointLight : public Light 
{ 
}; 
+0

「不正な戻り値」とはどういう意味ですか?実際にどの機能が呼び出されているか確認しましたか?いくつかのブレークポイントやトレースを入れ、呼び出される関数、Baseクラス、またはDerivedクラスのバージョンを確認します。 –

+0

なぜあなたはキャストしていますか、なぜあなたは '** invokeMethod'の戻り値をチェックしていませんか? – Mat

+0

戻り値のチェックは、関数が失敗した場合にプログラムでチェックするのに役立ちますが、値を調べているので、とにかく失敗していることが分かります。 – voodoogiant

答えて

3

使用qRegisterMetaType ...私のコードの一部です。

typedef QVector3D Point3; 
qRegisterMetaType<Point3>("Point3"); 

次に詳しく代わりQVector3D

Point3 retVal; 
QMetaObject::invokeMethod(obj, "center", 
             Qt::DirectConnection, 
             Q_RETURN_ARG(Point3, retVal)); 

のinvokeメソッドでこのタイプを使用invoke method documentationqRegisterMetaType documentationをチェックします。

+0

typedefは何らかの理由でtypedefを許可しないと考えました。エラーなしでqRegisterMetaTypeを使用することはできませんでした。「specializing member ':: qRegisterMetaType 」には' template <> '構文が必要ですが、Point3に切り替えると正常に動作しました。 – voodoogiant

関連する問題