Чтобы получить всю функциональность системы мета-типов Qt, мне нужно позвонить qRegisterMetaType
во время выполнения во время инициализации моего приложения. В частности, мне нужно зарегистрироваться:
QObject
классы, т.е. qRegisterMetaType<MyClass *>()
, а такжеQ_DECLARE_METATYPE
,В настоящее время я делаю это с помощью функции, которая просто вызывает qRegisterMetaType
для каждого из них, которые я вручную поддерживаю и обновляю по мере необходимости.
Это, однако, довольно неудобно и подвержено ошибкам для меня. Я часто забываю, и забыв зарегистрировать метатип, не вызовет ошибок компиляции, но это вызовет ошибки во время выполнения, когда мой код попытается использовать систему метатипа и потерпит неудачу, потому что я забыл зарегистрировать один из них. Иногда ошибки могут быть трудно отследить.
Так есть ли способ, которым я могу иметь все свои QObject
классы и объявленные метатипы регистрируются автоматически?
Некоторые вещи, которые могут повлиять на решение:
Я не могу найти способ автоматически объявлять мета-тип, т.е. без предоставления Q_DECLARE_METATYPE
макрос в заголовке класса, но можно предоставить макрос, где регистрация выполняется автоматически (более или менее вместе с объявлением мета-типа). Этот пример предназначен для объявления и
зарегистрировать только тип указателя данного класса:
#include <QMetaType>
#define METAID(CLASS) \
Q_DECLARE_METATYPE(CLASS*) \
static struct CLASS##Metaid \
{ \
CLASS##Metaid() \
{ \
qRegisterMetaType<CLASS*>(); \
} \
} _CLASS##metaid;
Макрос выше может быть использован вместо Q_DECLARE_METATYPE
:
class MyClass : public QObject
{
Q_OBJECT
};
METAID(MyClass)
Других решений пока нет …