Qt/C++:有没有办法自动注册元类型?
Qt / C++: Is there a way to automatically register meta types?
为了获得 Qt 元类型系统的所有功能,我必须在应用程序初始化期间在运行时调用 qRegisterMetaType
。具体来说,我需要注册:
- 我的每个
QObject
派生的 classes 的指针类型,即 qRegisterMetaType<MyClass *>()
和
- 我使用
Q_DECLARE_METATYPE
. 声明为元类型的每种类型
目前,我使用一个函数来执行此操作,该函数仅针对我手动维护并根据需要更新的每个函数调用 qRegisterMetaType
。
然而,这对我来说相当不方便且容易出错。我经常健忘,忘记注册一个元类型不会产生任何编译错误,但是当我的代码尝试使用元类型系统并因为我忘记注册其中之一而失败时,它会导致运行时错误。有时错误很难追踪。
那么有什么方法可以让我的所有 QObject
派生的 classes 和声明的元类型自动注册?
一些可能影响解决方案的因素:
- 我需要注册的所有 QObject 派生 classes 也都派生自我自己的单一基础 class,因此我可以使用它来实现其他所有 class 的功能会继承。
- 如有必要,我愿意使用神秘的编译器技术!
我想不出一种方法来自动声明元类型,即不在 class [=22] 中提供 Q_DECLARE_METATYPE
宏=],但可以提供一个自动执行注册的宏(或多或少与元类型声明一起)。这个例子是为了声明和
仅注册给定 class:
的指针类型
#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)
为了获得 Qt 元类型系统的所有功能,我必须在应用程序初始化期间在运行时调用 qRegisterMetaType
。具体来说,我需要注册:
- 我的每个
QObject
派生的 classes 的指针类型,即qRegisterMetaType<MyClass *>()
和 - 我使用
Q_DECLARE_METATYPE
. 声明为元类型的每种类型
目前,我使用一个函数来执行此操作,该函数仅针对我手动维护并根据需要更新的每个函数调用 qRegisterMetaType
。
然而,这对我来说相当不方便且容易出错。我经常健忘,忘记注册一个元类型不会产生任何编译错误,但是当我的代码尝试使用元类型系统并因为我忘记注册其中之一而失败时,它会导致运行时错误。有时错误很难追踪。
那么有什么方法可以让我的所有 QObject
派生的 classes 和声明的元类型自动注册?
一些可能影响解决方案的因素:
- 我需要注册的所有 QObject 派生 classes 也都派生自我自己的单一基础 class,因此我可以使用它来实现其他所有 class 的功能会继承。
- 如有必要,我愿意使用神秘的编译器技术!
我想不出一种方法来自动声明元类型,即不在 class [=22] 中提供 Q_DECLARE_METATYPE
宏=],但可以提供一个自动执行注册的宏(或多或少与元类型声明一起)。这个例子是为了声明和
仅注册给定 class:
#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)