Qt:不正确的返回值从invokemethod从继承超类

qt: incorrect return value from invokemethod from inherited superclass

本文关键字:invokemethod 超类 继承 返回值 不正确 Qt      更新时间:2023-10-16

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

使用qRegisterMetaType注册Point3类型定义。

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

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

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

查看invoke方法文档和qRegisterMetaType文档。