Чтобы получить всю функциональность системы метатипов Qt, мне нужно вызвать qRegisterMetaType
во время выполнения во время инициализации моего приложения. В частности, мне нужно зарегистрироваться:
- тип указателя для каждого из моих классов, производных от
QObject
, то естьqRegisterMetaType<MyClass *>()
, и - каждый тип, который я объявил как метатип, используя
Q_DECLARE_METATYPE
.
В настоящее время я делаю это с помощью функции, которая просто вызывает qRegisterMetaType
для каждого из них, которые я вручную поддерживаю и обновляю по мере необходимости.
Это, однако, довольно неудобно и подвержено ошибкам для меня. Я часто забывчив, и если я забуду зарегистрировать метатип, это не приведет к ошибкам компиляции, но вызовет ошибки времени выполнения, когда мой код попытается использовать систему метатипов и потерпит неудачу, потому что я забыл зарегистрировать один из них. Иногда ошибку бывает трудно отследить.
Итак, есть ли способ, которым я могу автоматически зарегистрировать все мои классы, производные от QObject
, и объявленные метатипы?
Некоторые вещи, которые могут повлиять на решение:
- Все мои классы, производные от QObject, которые мне нужно зарегистрировать, также являются производными от моего собственного единственного базового класса, поэтому я могу использовать его для реализации функций, которые унаследует любой другой класс.
- Я готов использовать тайные методы перкомпилятора, если это необходимо!
qRegisterMetaType
во время выполнения. И это следует использовать для каждого экземпляра exe/dll. Это можно сделать с помощью какого-то глобального контейнера, но поскольку в C++ порядок инициализации переменных не определен, это может быть нетривиально. Возможно, я скоро предоставлю вам пример - person Dmitry Sazonov   schedule 30.03.2018