【问题标题】:Qt : How to get all the classes that are children of a specific classQt:如何获取属于特定班级的所有班级
【发布时间】:2017-02-03 15:59:08
【问题描述】:

Qt 的元对象系统允许进行很多有趣的内省。但我的问题如下:假设我编写了class MyClass : public QObject。我想在我的 GUI 中有一个按钮来创建MyClass 的实例。但我决定创建MySubClass : public MyClass 并创建另一个按钮来创建MySubClass 的实例。

现在一位同事也创建了自己的子类。有没有办法自动找出所有扩展 MyClass 的类(并自动添加相关按钮)?

我可以看到一些解决方法,比如有一个 MetaObject 数组,这样我就可以在每个数组上调用 QMetaObject::newInstance(),但是每次将新的子类添加到代码库时,我都需要手动添加子类。

有自动的方法吗?如果需要,我可以限制自己使用实现特定 Q_INTERFACE 的类,如果它有任何区别的话。

【问题讨论】:

  • 我问这个问题是因为我知道我可以用 Java 做到这一点

标签: c++ qt introspection moc


【解决方案1】:

不,没有自动的方法来做到这一点,因为类没有在任何地方注册 - Q_OBJECT 宏只将成员直接添加到类,但不注册类。

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

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

给定:

class Factory {
public:
  class Registration {
  public:
     template <typename T> Registration(T*);
     ...
  };

};

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

【讨论】:

  • 我快要被说服了,但是 QMetaObject::newInstance() 在没有注册的情况下如何工作?
  • 我发现确实没有魔法,这就是为什么我不得不使用qRegisterMetaType()。所以你确实是正确的,我相信
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多