qt:来自继承超类的invokemethod的返回值不正确

时间:2011-10-27 03:03:00

标签: c++ qt reflection qt4

我有一个Light类,继承了一个继承自QObject的Transform类。 Transform类有一个center()函数,它返回一个Point3(QVector3D的typedef)。我试图在一个轻型对象上调用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(...)

这是我的一些代码......

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
{
};

1 个答案:

答案 0 :(得分:3)

使用qRegisterMetaType注册Point3 typedef。

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

然后在invoke方法中使用此类型而不是QVector3D

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

有关详细信息,请查看invoke method documentationqRegisterMetaType documentation