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
{
};
「不正な戻り値」とはどういう意味ですか?実際にどの機能が呼び出されているか確認しましたか?いくつかのブレークポイントやトレースを入れ、呼び出される関数、Baseクラス、またはDerivedクラスのバージョンを確認します。 –
なぜあなたはキャストしていますか、なぜあなたは '** invokeMethod'の戻り値をチェックしていませんか? – Mat
戻り値のチェックは、関数が失敗した場合にプログラムでチェックするのに役立ちますが、値を調べているので、とにかく失敗していることが分かります。 – voodoogiant