Система метаобъектов в Qt позволяет проводить много интересных самоанализов. Но моя проблема заключается в следующем: давайте предположим, что я закодировал class MyClass : public QObject
, Я хочу иметь кнопку в моем графическом интерфейсе для создания экземпляра MyClass
, Но я решил создать MySubClass : public MyClass
и я создаю еще одну кнопку, чтобы создать экземпляр MySubClass
,
Теперь коллега также создает свой собственный подкласс. Есть ли способ автоматически узнать все классы, которые расширяют MyClass
(и автоматически добавить соответствующую кнопку)?
Я вижу некоторые обходные пути, такие как наличие массива MetaObject
так что я могу позвонить QMetaObject::newInstance()
на каждом из них, но это требует от меня добавления подкласса вручную каждый раз, когда новый подкласс добавляется в кодовую базу.
Есть ли автоматический способ сделать это? При необходимости я могу ограничиться классами, которые реализуют определенные Q_INTERFACE
если это имеет какое-либо значение.
Нет, нет автоматического способа сделать это, потому что классы нигде не зарегистрированы — 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
занятия по первому использованию как минимум.
Других решений пока нет …