Qt/C:有没有办法自动注册元类型?

Qt / C++: Is there a way to automatically register meta types?

为了获得 Qt 元类型系统的所有功能,我必须在应用程序初始化期间在运行时调用 qRegisterMetaType。具体来说,我需要注册:

  • 我的每个 QObject 派生类的指针类型,即 qRegisterMetaType<MyClass *>(),以及
  • 我使用 Q_DECLARE_METATYPE 声明为元类型的每种类型。

目前,我使用一个函数来执行此操作,该函数只为每个我手动维护和更新的函数调用 qRegisterMetaType

然而,这对我来说相当不方便且容易出错。我经常健忘,忘记注册元类型不会产生任何编译错误,但是当我的代码尝试使用元类型系统并且因为我忘记注册其中一个而失败时,它会导致运行时错误。有时错误可能难以追踪。

那么有什么方法可以让我的所有 QObject 派生类和声明的元类型自动注册?

一些可能会影响解决方案的因素:

  • 我需要注册的所有 QObject 派生类也都派生自我自己的单个基类,因此我可以使用它来实现每个其他类都将继承的功能。
  • 如有必要,我愿意使用神秘的编译器技术!


我想不出一种自动声明元类型的方法,即不在类头中提供 Q_DECLARE_METATYPE 宏,但可以提供一个自动执行注册的宏(或多或少与元类型一起宣言)。此示例旨在声明和
只注册给定类的指针类型:

1
2
3
4
5
6
7
8
9
10
11
#include <QMetaType>

#define METAID(CLASS)                \\
    Q_DECLARE_METATYPE(CLASS*)       \\
    static struct CLASS##Metaid      \\
    {                                \\
      CLASS##Metaid()                \\
      {                              \\
        qRegisterMetaType<CLASS*>(); \\
      }                              \\
    } _CLASS##metaid;

上面的宏可以用来代替Q_DECLARE_METATYPE:

1
2
3
4
5
6
class MyClass : public QObject
{
Q_OBJECT
};

METAID(MyClass)