Допустим, у меня есть такой сигнал:
signals:
void progressNotification(int progress);
Я только недавно узнал о ключевом слове emit в Qt. До сих пор я использовал сигналы, просто вызывая их как обычную функцию. Так что вместо:
emit progressNotification(1000 * seconds);
Я бы написал:
progressNotification(1000 * seconds);
Вызов их таким образом, казалось, сработал, и все подключенные слоты будут выполняться, поэтому использование ключевого слова emit вызывает другое поведение или это просто синтаксический сахар?
emit
, не нужен. Тем не менее, странно, что вы узнали о нем спустяemit
много времени после непосредственного вызова сигналов, поскольку система сигнальных слотов - одна из первых вещей, которые нужно узнать о Qt.Ответы:
emit
просто синтаксический сахар. Если вы посмотрите на предварительно обработанный вывод функции, которая излучает сигнал, вы увидите, чтоemit
его просто нет.«Магия» происходит в сгенерированном коде для функции испускания сигналов, на которую вы можете взглянуть, проверив код C ++, сгенерированный moc.
Например,
foo
сигнал без параметров генерирует эту функцию-член:И код
emit foo();
предварительно обрабатывается, чтобы простоfoo();
emit
определяется вQt/qobjectdefs.h
(во всяком случае, в версии исходного кода с открытым исходным кодом), например:(Функция define Guard позволяет вам использовать Qt с другими фреймворками, которые имеют
no_keywords
конфликтующие имена, с помощью параметра конфигурации QMake.)источник
emit
которая на самом деле больше, чем ничего? Я обнаружил, что наличие `` синтаксического сахара '' в этом случае просто сбивает с толку новичка (или, по крайней мере, меня, когда я был начинающим пользователем Qt) - похоже, что сemit
псевдоключевым словом происходит что-то волшебное или важное , когда оно ничего не делает в all - вся магия происходит в обычной старой функции, котораяmoc
создает (moc
это магия для сигналов и слотов Qt).emit
это ненужное украшение, которое только кажется важным.emit
сообщает человеку, читающему вызов, о том, что вот-вот произойдет волшебство (т. е. это вызовет запуск кода в объектах, о которых этот класс потенциально никогда не слышал, и эти вызовы могут быть синхронными или асинхронными), что по существу полностью теряется, если вы пропустите ключевое слово. Используй это. Это автоматическое документирование. «Новичкам» следует читать документы и учебные пособия, и ониemit
всегда есть (по крайней мере, в официальных документах). Обнаружение того, что вы можете просто вызвать функцию, должно произойти после того, как вы «увидели свет» - вы уже не новичок.emit
"ключевое слово". Я думаю, что предпочел бы использовать соглашение об именах, если есть необходимость прояснить, что вызов функции является сигналом.emit
.emit
комментария-псевдо-ключевого слова заключалась в том, чтобы прояснить, что сигнал вызывается, тогда соглашение об именовании могло бы сделать то же самое, без тайна и с аналогичными преимуществами. Qt неmoc
может обеспечить соблюдение соглашения об именах (на самом деле, может обеспечить его соблюдение, но я тоже не защищаю это), но Qt не может принудительно использоватьemit
ни то, ни другое. И хотя вы можете «выключить»,emit
если возникнет конфликт имен, это не очень поможет, если у вас есть куча исходных файлов, которые его используют (без нужды для загрузки).Спустя 18 месяцев ... Я начал с комментариев под ответом @Mat, и мне быстро не хватало места. Итак, ответ.
IMO не
emit
является ни синтаксическим сахаром, ни простым ключевым словом в том смысле, чтоconnect
механизм признать , что на самом деле этоsignal
иВся система сигнал / слот - это идиома, отличная от простого вызова функции. Я считаю, что это проистекает из модели наблюдателя. Существует также большая разница между a
signal
и aslot
: сигнал не должен быть реализован, тогда как слот должен быть !Вы идете по улице и видите горит дом (сигнал). Вы набираете 911 ( соедините пожарный сигнал со слотом ответа 911 ). Сигнал только излучали , а слот реализовала пожарная служба. Может быть неточно, но идею вы поняли. Давайте посмотрим на пример ОП.
Некоторый серверный объект знает, какой прогресс был достигнут. Так что это могло просто
emit progressNotification(...)
сигнализировать. Класс, который отображает фактический индикатор выполнения, должен выбрать этот сигнал и выполнить его. Но как представление связано с этим сигналом? Добро пожаловать в систему сигналов / слотов Qt. Теперь можно представить себе класс менеджера (обычно своего рода виджет), который состоит из объекта представления и объекта вычисления данных (оба ониQObjects
), которые могут выполнятьconnect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.Давайте не будем вдаваться в аспекты дизайна класса менеджера, но достаточно сказать, что именно здесь система сигнал / слот проявляет себя. Я могу сосредоточиться на разработке очень чистой архитектуры для своего приложения. Не всегда, но часто я обнаруживаю, что просто отправляю сигналы, а использую слоты .
Если возможно использовать / вызвать метод сигнала, не испуская его , то это обязательно означает, что вам никогда не нужна эта функция в качестве сигнала .
источник
emit
это действительно всего лишь пустой макрос и совершенно необязательный. Не так являются ключевыми словамиsignal
иslot
которые обрабатываются МЦЕМ.signal
используется для обеспечения реализации функции,slot
используется для создания записи метаобъекта, чтобы ее можно было найти с помощьюSLOT(MySlot())
макроса или в QML.emit
синтаксически наводит на размышления. Никто никогда не будет жаловаться, если вы напишетеemit i++;
(но, возможно, ваши коллеги), а у вас все еще нет связиi++
.Второй вариант подразумевает, что вы всегда знаете, каковы имя функции и параметры функции, и что объект, которому вы его отправляете, известен этой конкретной функции. Эти два случая не всегда верны, так что это две основные причины, по которым были созданы слоты и сигналы. «Под капотом» механизм сигналов и слотов - это просто таблица с указателями на каждую подключенную функцию.
Также посмотрите этот PDF-файл, который очень четко объясняет природу механизма сигналов и слотов: http://www.elpauer.org/stuff/a_deeper_look_at_signals_and_slots.pdf
источник
emit
что это просто запрет. Но даже в этом случае чтение тела вопроса должно было прояснить ситуацию, поэтому -1.