Спустя 18 месяцев ... Я начал с комментариев под ответом @Mat, и мне быстро не хватало места. Итак, ответ.
IMO не emit
является ни синтаксическим сахаром, ни простым ключевым словом в том смысле, что
- Он генерирует код (как объяснено @Mat выше),
- Это помогает
connect
механизм признать , что на самом деле это signal
и
- Это делает ваш сигнал частью «более крупной» системы, где сигналы и ответы (слоты) могут выполняться синхронно или асинхронно или ставиться в очередь, в зависимости от того, где и как был испущен сигнал. Это чрезвычайно полезная функция системы сигнал / слот.
Вся система сигнал / слот - это идиома, отличная от простого вызова функции. Я считаю, что это проистекает из модели наблюдателя. Существует также большая разница между a signal
и a slot
: сигнал не должен быть реализован, тогда как слот должен быть !
Вы идете по улице и видите горит дом (сигнал). Вы набираете 911 ( соедините пожарный сигнал со слотом ответа 911 ). Сигнал только излучали , а слот реализовала пожарная служба. Может быть неточно, но идею вы поняли. Давайте посмотрим на пример ОП.
Некоторый серверный объект знает, какой прогресс был достигнут. Так что это могло просто emit progressNotification(...)
сигнализировать. Класс, который отображает фактический индикатор выполнения, должен выбрать этот сигнал и выполнить его. Но как представление связано с этим сигналом? Добро пожаловать в систему сигналов / слотов Qt. Теперь можно представить себе класс менеджера (обычно своего рода виджет), который состоит из объекта представления и объекта вычисления данных (оба они QObjects
), которые могут выполнять connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
Давайте не будем вдаваться в аспекты дизайна класса менеджера, но достаточно сказать, что именно здесь система сигнал / слот проявляет себя. Я могу сосредоточиться на разработке очень чистой архитектуры для своего приложения. Не всегда, но часто я обнаруживаю, что просто отправляю сигналы, а использую слоты .
Если возможно использовать / вызвать метод сигнала, не испуская его , то это обязательно означает, что вам никогда не нужна эта функция в качестве сигнала .
emit
, не нужен. Тем не менее, странно, что вы узнали о нем спустяemit
много времени после непосредственного вызова сигналов, поскольку система сигнальных слотов - одна из первых вещей, которые нужно узнать о Qt.