2011-10-27 74 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(...) 

下面是一些我的代碼...

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

「不正確的返回值」是什麼意思?你確認了哪個函數實際上被調用了嗎?放置一些斷點或跟蹤並驗證哪些函數被調用,基類或派生類版本。 –

+0

你爲什麼要投射,爲什麼你不**檢查invokeMethod的返回值? – Mat

+0

我想通過檢查返回值對編程檢查函數是否失敗很有用,但是由於我正在檢查這些值,所以我知道它是失敗的。 – voodoogiant

回答

3

使用qRegisterMetaType註冊點3的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

+0

我認爲typedef不會出於任何原因允許typedef。我不能使用沒有錯誤的qRegisterMetaType:「specializing member':: qRegisterMetaType 'requires'template <>'syntax。但是,切換到只是Point3工作正常。 – voodoogiant