使用 QVariant 的 Qt 调用方法

Posted

技术标签:

【中文标题】使用 QVariant 的 Qt 调用方法【英文标题】:Qt invoke method with QVariant 【发布时间】:2015-02-11 15:15:51 【问题描述】:

我有以下功能:

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

【问题讨论】:

【参考方案1】:

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

Here is some code for inspiration

【讨论】:

非常感谢您的建议。我做了小代码示例,它可以工作,我会将其发布为答案。但我仍然不清楚它为什么会起作用,如果你能解释一下【参考方案2】:

这是我的工作示例

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

【讨论】:

您可以通过从 QMetaMethod 获取返回类型名称而不是显式提供它来使这个示例更加通用(因此您必须首先找到 QObject 的元方法,然后通过 QMetheMethod 获取类型::类型名称())。

以上是关于使用 QVariant 的 Qt 调用方法的主要内容,如果未能解决你的问题,请参考以下文章

自定义数据类型使用QVariant转换的方法

Qt 5.0:向 Javascript 公开 C++ 方法

QVariant::fromValue 是如何工作的?

QVariant.toXXX 函数的函数指针

QVariant 调用存储对象的函数,定义在项目的主要部分

QT 调用 DLL 方法(三种方法)