Qt 确定已注册用户类型的超类

Qt 确定已注册用户类型的超类,qt,Qt,我试图确定哪些类是从几个不同类型中派生出来的。例如,若E1扩展了A,E2扩展了A,E3扩展了B,我想找到所有从A子类化的类,并返回类型E1和E2的列表。这些类型在QMetaSystem中注册 我的第一次尝试是迭代用户声明的类型,实例化它,并获取超类名称: int type = QMetaType::User; while( QMetaType::isRegistered(type) ) { QObject *o = (QObject*)QMetaType::construct(type)

我试图确定哪些类是从几个不同类型中派生出来的。例如,若E1扩展了A,E2扩展了A,E3扩展了B,我想找到所有从A子类化的类,并返回类型E1和E2的列表。这些类型在QMetaSystem中注册

我的第一次尝试是迭代用户声明的类型,实例化它,并获取超类名称:

int type = QMetaType::User;
while( QMetaType::isRegistered(type) ) {
    QObject *o = (QObject*)QMetaType::construct(type);
    QString parent = o->metaObject()->superClass()->className();
}
当我写这篇文章的时候,这似乎是个坏主意,我没想到它会起作用。毫不奇怪,它在尝试获取元对象时会出错

是否可以从QMetaType获取我需要的信息,或者是否有其他方法获取此信息

更新

问题似乎在于尝试迭代所有用户类型。在我注册我的类型之前,一些Qt类型似乎比我的先注册。具体而言,两种注册类型是QPaintBufferCacheEntry(typeId=256)和QPaintBufferCacheEntryV2(typeId=257)。我可以很好地初始化对象,但是当我试图获取元对象时它崩溃了,所以我认为强制转换是非法的。我不太确定这些代码是在哪里注册的,因为我的代码库没有显式地进行注册


我认为这意味着迭代和构造每个用户类型是不安全的。

你的想法是正确的。这将为您提供父类的名称:

QObject *o = (QObject*)QMetaType::construct(type);
QString parent = o->metaObject()->superClass()->className();
要使其正常工作,必须使用
Q\u DECLARE\u元类型(Type)
声明类,并使用
qRegisterMetaType()
注册类。当
QMetaType::isRegistered(type)
为true时,就是这种情况

用户定义的类还必须继承QObject(直接继承或不继承)并在其定义中具有。这可以解释你的错误

superClass()
如果没有父类,也可以返回0,但是这里所有的类至少应该继承QObject


还有
QObject::inherits(const char*className)
可以知道对象是否属于从className继承的类。

您的想法是正确的。这将为您提供父类的名称:

QObject *o = (QObject*)QMetaType::construct(type);
QString parent = o->metaObject()->superClass()->className();
要使其正常工作,必须使用
Q\u DECLARE\u元类型(Type)
声明类,并使用
qRegisterMetaType()
注册类。当
QMetaType::isRegistered(type)
为true时,就是这种情况

用户定义的类还必须继承QObject(直接继承或不继承)并在其定义中具有。这可以解释你的错误

superClass()
如果没有父类,也可以返回0,但是这里所有的类至少应该继承QObject


还有
QObject::inherits(const char*className)
可以知道对象是否属于从className继承的类。

谢谢您提供的信息!我甚至不知道
继承
成员。不幸的是,问题仍然存在。我用更多的信息更新了原来的问题。谢谢你的信息!我甚至不知道
继承
成员。不幸的是,问题仍然存在。我用更多的信息更新了原来的问题。我用Qt4.8做了一个小测试,没有得到额外的注册类型。我不认为你能知道一个类型是否可以被转换到QObject,所以我唯一的想法就是列出你的类型,然后迭代…我用Qt4.8做了一个小测试,没有得到额外注册的类型。我不认为你能知道一个类型是否能被转换成QObject,所以我唯一的想法就是列出你的类型并迭代它。。。