1

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

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

4

1 回答 1

1

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

QObject *o = (QObject*)QMetaType::construct(type);
QString parent = o->metaObject()->superClass()->className();

为了让它工作,你的类必须已经Q_DECLARE_METATYPE(Type)qRegisterMetaType(). 情况QMetaType::isRegistered(type)确实如此。

您的用户定义的类还必须继承自 QObject(直接或不直接),并在其定义中包含Q_OBJECT 宏。这可以解释你的段错误。

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

还要QObject::inherits(const char * className)知道一个对象是否属于一个类继承,甚至是间接继承自 className。

于 2012-11-07T21:36:01.807 回答