base类到所有派生类c ++ Qt

时间:2015-04-02 11:40:32

标签: qt c++11

我在获取从基类继承的所有类的类名时遇到问题。

Class Base
{
};
Class A:public Base
{
};
Class B:public Base
{
};
Class C:public Base
{
};

.....等等。我的要求是我想知道从类Base继承的所有类名。基类中有什么方法或方法可以让我知道所有的类吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

Qt允许这样做有以下限制:

  • 所有涉及的课程都应来自QObject
  • 每个类都应该在全局类列表中注册。 Qt没有提供获取完整列表的方法。

有关QObject派生类的元信息存储在QMetaObject中,可通过T::staticMetaObject访问。首先,您希望获得应用程序中所有元对象的列表。你可以使用这样的东西:

QList<const QMetaObject*> global_list;
template<class T> register_class() {
  global_list << &T::staticMetaObject;
}

//execute the following at program initialization
register_class<Base>();
register_class<A>();
register_class<B>();
register_class<C>();

要获取从Base派生的类名列表,您需要:

  1. 获取目标类的const QMetaObject*为&amp; Base :: staticMetaObject。
  2. 遍历全局元对象列表并检查QMetaObject::​superClass是否返回目标元对象。如果还应检测到间接继承,则可能需要执行递归检查。
  3. 使用QMetaObject::​className获取已找到子类的名称。