Если я зарегистрирую пользовательский тип, подобный следующему, для использования в подключениях с очередями:
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 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 является зарегистрированным мета-типом.
Других решений пока нет …