注册类型与容器

Registering types vs containers

本文关键字:类型 注册      更新时间:2023-10-16

如果我注册如下自定义类型,以便在排队连接中使用:

Q_DECLARE_METATYPE(MyClass);
qRegisterMetaType<MyClass>();

我可以将排队连接中的类型与这样的信号一起使用:

void MySignal(MyType o);

现在我还想将类型与这样的信号一起使用:

void MyVectorSignal(QVector<MyType> v);

我记得我在某处读到Qt自动允许将注册类型与容器一起使用,而无需明确注册特定的类型/容器组合。

但这对我不起作用。我还必须注册容器:

Q_DECLARE_METATYPE(QVector<MyType>);
qRegisterMetaType<QVector<MyType>>();

它应该在没有后一个注册码的情况下工作吗?这真的有必要吗?容器应该开箱即用吗?

来自 Qt 文档Q_DECLARE_METATYPE:

某些类型是自动注册的,不需要此宏:

  • 指向从 QObject 派生的类的指针
  • QList、QVector、QQueue、QStack、QSet 或 QLinkedList,其中 T 是已注册的元类型
  • QHash、QMap 或 QPair,其中 T1 和 T2 是注册的元类型
  • QPointer,QSharedPointer,QWeakPointer,其中T是从QObject派生的类
  • 向Q_ENUM或Q_FLAG注册的枚举
  • 具有Q_GADGET宏的类

所以你不需要注册QVector<T>.只需确保 T 是已注册的元类型即可。