Через 18 місяців ... Я почав із коментарів під відповіддю @ Mat, і швидко закінчився номер. Таким чином відповідь.
ІМО emit
не є ні синтаксичним цукром, ні простим ключовим словом у тому сенсі
- Він генерує код (як пояснив @Mat вище),
- Це допомагає
connect
механізму визнати, що насправді це є signal
, і
- Це робить ваш сигнал частиною "більшої" системи, де сигнали та відповіді (слоти) можуть виконуватися синхронно або асинхронно, або в черзі, залежно від того, де і як сигнал випромінювався. Це надзвичайно корисна функція системи сигнал / слот.
Вся система сигнал / слот - це інша ідіома, ніж простий виклик функції. Я вважаю, що це випливає із моделі спостерігачів. Також існує велика різниця між a signal
і a slot
: сигнал не повинен бути реалізований, тоді як слот повинен бути !
Ви йдете вулицею і бачите палаючий будинок (сигнал). Ви набираєте номер 911 ( підключіть сигнал пожежі до гнізда відповіді 911 ). Сигнал був лише випущений , тоді як слот був реалізований пожежною службою. Можливо, це неточно, але ви зрозуміли ідею. Давайте розглянемо приклад OP.
Деякий серверний об'єкт знає, наскільки успішно досягнуто. Тож це могло просто emit progressNotification(...)
сигналізувати. Клас, який відображає фактичну індикацію прогресу, повинен взяти цей сигнал і виконати на ньому. Але як подання підключається до цього сигналу? Ласкаво просимо до системи сигналів / слотів Qt. Тепер можна уявити клас менеджера (як правило, віджет сортів), який складається з об’єкта подання та об’єкта обчислення даних (обидва вони QObjects
можуть бути ) connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
Не будемо вдаватися до аспектів дизайну класу менеджера, але достатньо сказати, що саме тут світить система сигналів / слотів. Я можу зосередитись на розробці дуже чистої архітектури для мого додатка. Не завжди, але часто буває, я виявляю, що я просто видаю сигнали, але реалізую слоти .
Якщо можливо використовувати / викликати метод сигналу, ніколи його не видаючи , то це обов'язково означає, що вам ніколи не була потрібна ця функція як сигнал .
emit
це не потрібно. Однак дивно, що ви дізналися про цеemit
довго після безпосереднього виклику сигналів, оскільки система слот-сигналів є однією з перших речей, які слід дізнатися про Qt.