0

如果我注册如下自定义类型,用于排队连接:

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

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

void MySignal(MyType o);

现在我也想使用带有这样信号的类型:

void MyVectorSignal(QVector<MyType> v);

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

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

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

如果没有后一个注册码,它应该工作吗?这真的有必要吗?容器应该开箱即用吗?

4

1 回答 1

0

来自Q_DECLARE_METATYPE 的Qt 文档

有些类型是自动注册的,不需要这个宏:

  • 指向从 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 是一个注册的元类型。

于 2017-01-21T11:01:33.077 回答