2017-01-21 5 views
0

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

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, где Т представляет собой класс, производный от QObject
  • Перечни зарегистрированных Q_ENUM или Q_FLAG
  • классов, которые имеют Q_GADGET макросъемки

Так что вам не нужно зарегистрируйтесь QVector<T>. Просто убедитесь, что T является зарегистрированным мета-типом.

Смежные вопросы