我试图确定哪些类是从几种不同类型中子类化的。例如,如果 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)。我可以很好地初始化对象,但是当我尝试获取元对象时它会崩溃,所以我认为强制转换是非法的。我不太确定这些是在哪里注册的,因为我的代码库没有明确地这样做。
我认为这意味着迭代和构造每个用户类型是不安全的。