使用QVariant调用Qt方法

Qt invoke method with QVariant

本文关键字:方法 Qt 调用 QVariant 使用      更新时间:2023-10-16

我有以下功能:

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)
     );

您可以通过QMetaMethod::returnType()检查方法返回类型,然后使用QGenericReturnArgument构造返回值接收器。

以下是一些灵感的代码

这是我的工作示例

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>();