2014-09-12 13 views
0

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

emit(slotname()); 

Мне нравится, что я могу пропустить шаг создания сигнала и подключения, но делает ли это ДЕЙСТВИТЕЛЬНО причиной того, что слот обрабатывается через очередь событий? Или это просто вызов метода слота напрямую?

ответ

3

No. emit(slotname()) равно (slotname()), который просто вызывает slotname()непосредственно без очереди. И он не будет автоматически вызывать другие слоты, подключенные к сигналу.

emit - фактически макрос, который не имеет значения. Это просто синтаксический сахар, чтобы показать, что код излучает сигнал. Таким образом, следующая строка

emit nameChanged() 

эквивалентно

nameChanged() 

Это ничего особенного, вы на самом деле вызов метода nameChanged() сигнала. Разница в том, что вы сами не реализуете метод сигнала. Вы оставляете mt Qt для генерации реализации. Сгенерированная реализация вызовет все подключенные слоты, напрямую или через очередь, в зависимости от того, как были сделаны соединения и исполняемый поток.

Поэтому emit(slotname()) побеждает цель и сбивает с толку читателей кода.

Если вам интересно, emit определяется в QtCore\qobjectdefs.h:

# define emit