2017-02-03 80 views
0

Qt的元对象系统允许进行很多有趣的反思。但我的问题如下:假设我编码了class MyClass : public QObject。我想在我的GUI中有一个按钮来创建MyClass的实例。但我决定创建MySubClass : public MyClass,然后创建另一个按钮来创建MySubClass的实例。Qt:如何获得特定类的儿童的所有类

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

我可以看到一些解决方法一样具有MetaObject阵列,使得我可以叫他们每个人的QMetaObject::newInstance(),但它需要我手动添加子,每次一个新sublass被添加到代码库。

有没有一种自动的方式来做到这一点?如果需要,我可以将自己限制在实现特定Q_INTERFACE的类中,如果它有任何区别的话。

+0

我问这个问题,因为我知道我可以在Java中做到这一点 – Fezvez

回答

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类。

+0

我即将被说服,但那么QMetaObject :: newInstance()如何在没有注册的情况下工作? – Fezvez

+0

我发现确实没有魔法,这就是为什么我不得不使用qRegisterMetaType()。所以你确实是对的,我确信 – Fezvez