为了获得 Qt 元类型系统的所有功能,我必须调用 qRegisterMetaType
在我的应用程序初始化期间的运行时。具体来说,我需要注册:
- 我的每个
QObject
的指针类型-派生类,即qRegisterMetaType<MyClass *>()
, 和 - 我使用
Q_DECLARE_METATYPE
声明为元类型的每种类型.
目前我用一个只调用 qRegisterMetaType
的函数来做到这一点对于其中的每一个,我都会根据需要手动维护和更新。
然而,这对我来说相当不方便且容易出错。我经常健忘,忘记注册一个元类型不会产生任何编译错误,但是当我的代码尝试使用元类型系统并因为我忘记注册其中之一而失败时,它会导致运行时错误。有时错误很难追踪。
那么有什么办法可以让我拥有我所有的 QObject
- 派生类和声明的元类型会自动注册吗?
一些可能影响解决方案的因素:
- 我需要注册的所有 QObject 派生类也都派生 self 自己的单个基类,因此我可以使用它来实现所有其他类将继承的功能。
- 如有必要,我愿意使用神秘的 percompiler 技术!
最佳答案
我想不出一种方法来自动声明元类型,即不在类 header 中提供 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)
关于c++ - Qt/C++ : Is there a way to automatically register meta types?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49563976/