Регистрация типов против контейнеров

Если я зарегистрирую пользовательский тип, подобный следующему, для использования в подключениях с очередями:

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

Решение

От 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 является зарегистрированным мета-типом.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]