Qt / C ++: есть ли способ автоматически регистрировать мета-типы?

Чтобы получить всю функциональность системы мета-типов Qt, мне нужно позвонить qRegisterMetaType во время выполнения во время инициализации моего приложения. В частности, мне нужно зарегистрироваться:

  • тип указателя для каждого из моих QObjectклассы, т.е. qRegisterMetaType<MyClass *>(), а также
  • каждый тип, который я объявил как мета-тип, используя Q_DECLARE_METATYPE,

В настоящее время я делаю это с помощью функции, которая просто вызывает qRegisterMetaType для каждого из них, которые я вручную поддерживаю и обновляю по мере необходимости.

Это, однако, довольно неудобно и подвержено ошибкам для меня. Я часто забываю, и забыв зарегистрировать метатип, не вызовет ошибок компиляции, но это вызовет ошибки во время выполнения, когда мой код попытается использовать систему метатипа и потерпит неудачу, потому что я забыл зарегистрировать один из них. Иногда ошибки могут быть трудно отследить.

Так есть ли способ, которым я могу иметь все свои QObjectклассы и объявленные метатипы регистрируются автоматически?

Некоторые вещи, которые могут повлиять на решение:

  • Все мои классы, производные от QObject, которые мне нужны, также получены из моего собственного базового класса, так что я могу использовать его для реализации функциональности, которую унаследует любой другой класс.
  • Я открыт для использования тайных технологий компилятора при необходимости!

1

Решение

Я не могу найти способ автоматически объявлять мета-тип, т.е. без предоставления 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)
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]