注册类型与容器

时间:2017-01-21 09:45:23

标签: c++ qt containers qmetatype queued-connection

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

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

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

void MySignal(MyType o);

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

void MyVectorSignal(QVector<MyType> v);

我记得我读过某个地方,Qt自动允许使用带容器的注册类型,而不会明确地注册特定的类型/容器组合。

但它对我没用。我也必须注册容器:

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

如果没有后一个注册码,它应该可以吗?这实际上是必要的吗?容器应该开箱即用吗?

1 个答案:

答案 0 :(得分:0)

来自Qt docs的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是已注册的元类型。