C++ 使用QVariant调用Qt方法

C++ 使用QVariant调用Qt方法,c++,qt,C++,Qt,我有以下功能: class TestClass: public QObject { Q_OBJECT public: Q_INVOKABLE QString test() { return QString("test"); } }; 我想调用test方法,但返回类型是QVariant,而不是QString。所以我试了一下: TestClass obj; QVariant returnedValue; bool rslt= QMetaObject::invokeMet

我有以下功能:

class TestClass: public QObject
{
  Q_OBJECT
public:      
  Q_INVOKABLE QString test() { return QString("test"); }
};
我想调用test方法,但返回类型是QVariant,而不是QString。所以我试了一下:

 TestClass obj;
 QVariant returnedValue;
 bool rslt=  QMetaObject::invokeMethod(&obj, "test", Qt::DirectConnection,
     Q_RETURN_ARG(QVariant, returnedValue)
     );
 QString strVar = returnedValue.toString();
但它不起作用,调用返回false

如果将返回类型设置为QString,则它可以工作,但不幸的是,这对我来说不可用,因为在调用函数之前,我需要知道返回类型

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

您可以通过检查方法返回类型,然后使用构造返回值接收器


这是我的工作示例

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>();
class TestClass:公共QObject
{
Q_对象
公众:
Q_可调用MyStruct test(){return MyStruct(5);}
};
Q_DECLARE_元类型(MyStruct)
intttr=qRegisterMetaType();
测试类obj;
int thetype=QMetaType::type(“MyStruct”);
void*v=NULL;
QVariant返回值(类型v);
void*data=returnedValue.data();
bool rslt=QMetaObject::invokeMethod(&obj,“test”,Qt::DirectConnection,
QGenericReturnArgument(“MyStruct”,数据)
);
bool can=returnedValue.canConvert();
MyStruct structm=returnedValue.value();

非常感谢您的建议。我做了一个小的代码示例,我会把它作为答案发布。但是我仍然不清楚它为什么会起作用,如果您可以解释的话,您可以通过从QMetaMethod获取返回类型名称而不是显式提供它来使这个示例更加通用(因此您必须首先找到QObject的元方法,然后通过QMetheMethod::typeName()获取类型)。