2017-02-03 7 views
0

Система метаобъектов Qt позволяет много интересной интроспекции. Но моя проблема заключается в следующем: предположим, что я закодировал class MyClass : public QObject. Я хочу иметь кнопку в моем графическом интерфейсе, чтобы создать экземпляр MyClass. Но я решил создать MySubClass : public MyClass, и я создаю еще одну кнопку для создания экземпляра MySubClass.Qt: Как получить все классы, являющиеся дочерними элементами определенного класса.

Теперь коллега также создает свой собственный подкласс. Есть ли способ автоматически узнать все классы, которые расширяют MyClass (и автоматически добавить соответствующую кнопку)?

Я вижу некоторое обходное решение, подобное наличию массива MetaObject, так что я могу вызвать QMetaObject::newInstance() на каждом из них, но мне требуется добавить вручную подкласс каждый раз, когда в базу данных добавляется новый подкласс.

Есть ли автоматический способ сделать это? В случае необходимости я могу ограничиться классами, которые реализуют конкретный 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