如果我注册如下自定义类型,以便在排队连接中使用:
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 是已注册的元类型即可。