使用 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 调用方法的主要内容,如果未能解决你的问题,请参考以下文章