我必须使用反射创建一个对象的实例(QObject
的子类)。
假设此对象为MyQObject
,并使用Q_PROPERTY
宏声明了以下属性:MyQObject1* p1
,MyQObject2* p2
,MyQObject3* p3
,... < / p>
假设我有这个功能:
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
的子类,可能不完全相同。在此示例中,QList
包含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
,...)我无法逐个投射,因为我不知道这些信息在编译时。
那么,有什么想法吗?
我将非常感谢你的帮助。感谢。