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

标签 c++ qt qobject qmetatype

为了获得 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/

相关文章:

c++ - removeWidget() 不工作

python - Python 中的 C++ 库 : custom sorting method

c# - 通过代理隧道化应用程序的所有连接

c++ - Qt : restarting thread

c++ - Qt多线程启动线程报错

c++ - Windows.h - 焦点进入文本输入时的通知

c++ - QScrollArea vertical sizePolicy - 将内容调整到最大高度

c++ - 如何在 Qt 中使用 java 风格的迭代器而不是 STL 风格的迭代器?

c++ - 添加空间隔 Widget 导致 Qt 中的内存泄漏?

qt - 在 Qt 中检查 QObject 派生类类型的正确方法