0

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

假设这个对象是并且已经使用宏MyQObject声明了以下属性: , , , ...Q_PROPERTYMyQObject1* p1MyQObject2* p2MyQObject3* 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,...)的不同类型,我无法一一进行转换,因为我在编译时不知道这些信息。

那么,有什么想法吗?

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

4

0 回答 0