C++ Qt:如何获取作为特定类的子类的所有类

C++ Qt:如何获取作为特定类的子类的所有类,c++,qt,introspection,moc,C++,Qt,Introspection,Moc,Qt的元对象系统允许许多有趣的自省。但我的问题是:假设我编写了一个类MyClass:publicqobject。我想在GUI中有一个按钮来创建MyClass的实例。但是我决定创建MySubClass:publicmyclass,并创建另一个按钮来创建MySubClass的实例 现在,一位同事还创建了自己的子类。是否有一种方法可以自动查找扩展了MyClass的所有类(并自动添加相关按钮) 我可以看到一些解决方法,比如拥有一个元对象数组,这样我就可以对它们中的每一个调用QMetaObject::ne

Qt的元对象系统允许许多有趣的自省。但我的问题是:假设我编写了一个
类MyClass:publicqobject
。我想在GUI中有一个按钮来创建
MyClass
的实例。但是我决定创建
MySubClass:publicmyclass
,并创建另一个按钮来创建
MySubClass
的实例

现在,一位同事还创建了自己的子类。是否有一种方法可以自动查找扩展了
MyClass
的所有类(并自动添加相关按钮)

我可以看到一些解决方法,比如拥有一个
元对象数组
,这样我就可以对它们中的每一个调用
QMetaObject::newInstance()
,但它需要我在每次向代码库添加新子类时手动添加子类


有没有一种自动的方法?如果需要的话,我可以将自己限制在实现特定
Q_接口的类上,如果这样做有任何区别的话。

不,没有自动的方法,因为类没有在任何地方注册-一个
Q_对象
宏只会直接将成员添加到类中,而不会注册类

您可以添加一个项目范围的定义,修改
Q_对象
,通过成员添加工厂注册,例如:

// this declaration added to `Q_OBJECT`:
Factory::Registration q_obj_reg{this};
鉴于:

class Factory {
public:
  class Registration {
  public:
     template <typename T> Registration(T*);
     ...
  };
类工厂{
公众:
班级注册{
公众:
模板注册(T*);
...
};
})


这将至少在第一次使用时自动注册所有
QObject
类。

我问这个问题是因为我知道我可以在Java中完成,我即将被说服,但是没有注册的情况下QMetaObject::newInstance()如何工作呢?我发现确实没有魔法,这就是为什么我必须使用qRegisterMetaType()。所以你确实是对的,我相信