2015-02-11 51 views
2

我有以下功能:Qt的調用方法與的QVariant

class TestClass: public QObject 
{ 
    Q_OBJECT 
public:  
    Q_INVOKABLE QString test() { return QString("test"); } 
}; 

我想調用的測試方法,但得到的返回類型的QVariant,還不如QString的。所以我試過這個:

TestClass obj; 
QVariant returnedValue; 
bool rslt= QMetaObject::invokeMethod(&obj, "test", Qt::DirectConnection, 
    Q_RETURN_ARG(QVariant, returnedValue) 
    ); 
QString strVar = returnedValue.toString(); 

但它不工作,invoke返回false;

如果得到的返回類型爲QString,它可以工作,但不幸的是這對我來說不可用,因爲我需要在調用函數之前知道返回類型。

QString r; 
bool rslt= QMetaObject::invokeMethod(&obj, "test", Qt::DirectConnection, 
    Q_RETURN_ARG(QString, r) 
    ); 

回答

0

這是我的工作示例

class TestClass: public QObject 
{ 
Q_OBJECT 
public:  
    Q_INVOKABLE MyStruct test() { return MyStruct(5); } 
}; 
Q_DECLARE_METATYPE(MyStruct) 
int ttr=qRegisterMetaType<MyStruct>(); 

TestClass obj;  

int thetype = QMetaType::type("MyStruct"); 
void *v = NULL; 
QVariant returnedValue (thetype,v); 
void* data = returnedValue.data(); 

bool rslt= QMetaObject::invokeMethod(&obj, "test", Qt::DirectConnection, 
    QGenericReturnArgument("MyStruct", data) 
    ); 

bool can = returnedValue.canConvert<MyStruct>(); 
MyStruct structm = returnedValue.value<MyStruct>(); 
+0

你可以通過從QMetaMethod獲取返回類型名稱而不是顯式提供它來使這個例子更通用(所以你必須先找到你的QObject的元方法,然後通過QMetheMethod :: typeName()獲取類型)。 – Archie 2015-02-12 12:21:46

+0

是的,謝謝你,我知道這一點 – user152508 2015-02-12 12:35:34

相關問題