我不能使用反射从作为QObject的子类创建的对象中获取QObject信息

时间:2013-08-27 15:24:44

标签: c++ qt qt4

我必须使用反射创建一个对象的实例(QObject的子类)。

假设此对象为MyQObject,并使用Q_PROPERTY宏声明了以下属性:MyQObject1* p1MyQObject2* p2MyQObject3* 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",...

oparamsQList<QObject*>,包含已实例化的对象的属性。它们本身都不是QObject,而是QObject的子类,可能不完全相同。在此示例中,QList包含MyQObject1MyQObject2MyQObject3的实例...

我的问题是虽然创建了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时,它们是自动铸造),是导致问题的原因。

由于属性的类型不同(MyQObject1MyQObject2MyQObject3,...)我无法逐个投射,因为我不知道这些信息在编译时。

那么,有什么想法吗?

我将非常感谢你的帮助。感谢。

0 个答案:

没有答案