如果我注册了如下所示的自定义类型,以便在排队连接中使用:
Q_DECLARE_METATYPE(MyClass);
qRegisterMetaType<MyClass>();
我可以使用排队连接中的类型与这样的信号:
void MySignal(MyType o);
现在我也想使用这样的信号类型:
void MyVectorSignal(QVector<MyType> v);
我记得我读过某个地方,Qt自动允许使用带容器的注册类型,而不会明确地注册特定的类型/容器组合。
但它对我没用。我也必须注册容器:
Q_DECLARE_METATYPE(QVector<MyType>);
qRegisterMetaType<QVector<MyType>>();
如果没有后一个注册码,它应该可以吗?这实际上是必要的吗?容器应该开箱即用吗?
答案 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是已注册的元类型。