2016-10-10 5 views
0

В случае использования настраиваемого типа в очереди. Какова правильная последовательность регистрации моего пользовательского типа?Должен ли я позвонить Q_DECLARE_METATYPE перед вызовом qRegisterMetaType?

Необходимо позвонить по телефону Q_DECLARE_METATYPE до qRegisterMetaType?

Почему я должен регистрировать нестандартный тип сигнала, но не для прямого сигнала?

+1

1. Да, это необходимо. 2. Поскольку для очереди в очереди требуется дополнительная инициализация времени выполнения и возможность сделать глубокую копию аргументов. Btw, вы можете обернуть данные в 'QVariant' и использовать его в качестве аргументов –

ответ

4

Нужно ли звонить Q_DECLARE_METATYPE перед qRegisterMetaType?

Это. В документе Qt на qRegisterMetaType явно указано:

T должно быть объявлено с помощью Q_DECLARE_METATYPE().

Вы должны зарегистрировать свой собственный тип для очереди сигналов, поскольку при его регистрации, Qt может сделать копию в своем цикле обработки событий (которые, безусловно, использует QVariant) и передать его в качестве аргумента позже (когда оригинал передается значение давно выходит за рамки).

3

Вопрос: ерунда: Q_DECLARE_METATYPE не является вызовом. Он определяет struct QMetaTypeId<TYPE>. Очевидно, что вызов qRegisterMetaType<T>(...) или любого другого вызываемого пользователя не может объявить тип для использования за пределами сайта вызова.

Так что независимо от того, что делает Q_DECLARE_METATYPE, это невозможно, написав вызов функции. Если вам нужна функциональность, предоставляемая Q_DECLARE_METATYPE, вам придется использовать ее.

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