QObject
我必须使用反射创建一个对象的实例(的子类)。
假设这个对象是并且已经使用宏MyQObject
声明了以下属性: , , , ...Q_PROPERTY
MyQObject1* p1
MyQObject2* p2
MyQObject3* p3
假设我有这个功能来做到这一点:
QObject* Manager::createInstanceOf(const QMetaObject* c, QList<const char*> paramsNames, QList<QObject*> oparams) {
QObject* instance = (QObject*) c->newInstance();
for(int i = 0; i < paramsNames.length(); i++) {
QVariant variant = QVariant::fromValue(oparams[i]);
instance->setProperty(paramsNames[i], variant);
}
return instance;
}
在哪里:
c
是与QMetaObject*
相关联的MyQObject
。
paramsNames
是一个包含通过宏QList<const char*>
在对象的类定义中声明的属性的名称。Q_PROPERTY
在此示例中,QList
包含:"MyQObject1"
, "MyQObject2"
, "MyQObject3"
, ...
oparams
是一个QList<QObject*>
包含已经实例化的对象的属性。它们都不是QObject
本身,而是 , 的子类QObject
,并且可能并不完全相同。在此示例中, aQList
包含MyQObject1
, MyQObject2
, MyQObject3
...的实例
我的问题是,尽管MyQObject
创建了 的实例并且使用Q_DECLARE_METATYPE
宏和注册了类型,但如果没有段错误qRegisterMetaType
,我无法访问与之关联的任何属性的方法QObject
。简而言之,我做不到:
myQObjectInstance->property("p1").value<MyQObject1*>()->metaObject();
但我可以毫无问题地访问不是来自的属性的其他方法QObject
。例如:
myQObjectInstance->property("p1").value<MyQObject1*>()->toString();
我意识到,如果我在执行之前转换属性setProperty
,我的问题可以部分解决:
QVariant::fromValue((MyQObject1*) oparams[0]);
似乎是,如果该属性未设置为QObject
创建时的特定子类,而是转换为其超类(插入时oparams
QList
它们会自动转换),这就是导致问题的原因。
由于属性(MyQObject1
, MyQObject2
, MyQObject3
,...)的不同类型,我无法一一进行转换,因为我在编译时不知道这些信息。
那么,有什么想法吗?
我将非常感谢您的帮助。谢谢。