2015-02-11 4 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) 
    ); 

ответ

3

Вы можете проверить метод типа возвращаемого с помощью QMetaMethod::returnType(), а затем построить рецептор возвращаемого значения с помощью QGenericReturnArgument.

Here is some code for inspiration

+0

Большое спасибо за ваше предложение. Я сделал небольшой пример кода, который работает, я отправлю его в качестве ответа. Но все же я не понимаю, почему это работает, если вы, возможно, можете объяснить – user152508

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

+0

Да, спасибо, я знаю, что – user152508

Смежные вопросы