Подтвердить что ты не робот

Использование emit vs вызывает сигнал, как будто он является регулярной функцией в Qt

Скажем, у меня есть этот сигнал:

signals:
    void progressNotification(int progress);

Я только недавно узнал о ключевом слове emit в Qt. До сих пор я использовал сигналы, просто называя их как обычную функцию. Поэтому вместо:

emit progressNotification(1000 * seconds);

Я бы написал:

progressNotification(1000 * seconds);

Вызвать их, как это, казалось, сработало, и все подключенные слоты будут выполняться, поэтому использование ключевого слова emit вызывает другое поведение или это просто синтаксический сахар?

4b9b3361

Ответ 1

emit - это просто синтаксический сахар. Если вы посмотрите на предварительно обработанный вывод функции, которая испускает сигнал, вы увидите, что emit просто ушел.

"Магия" происходит в сгенерированном коде для функции испускания сигнала, которую вы можете посмотреть, проверив код С++, сгенерированный moc.

Например, сигнал foo без параметров генерирует эту функцию-член:

void W::foo()
{
    QMetaObject::activate(this, &staticMetaObject, 0, 0);
}

И код emit foo(); предварительно обрабатывается просто foo();

emit определяется в Qt/qobjectdefs.h (в аромате источника с открытым исходным кодом в любом случае), например:

#ifndef QT_NO_EMIT
# define emit
#endif

(Защитник define позволяет вам использовать Qt с другими фреймворками, которые сталкиваются с именами, с помощью опции no_keywords QMake config.)

Ответ 2

Через 18 месяцев... Я начал с комментариев в ответ @Mat и быстро вышел из комнаты. Таким образом, ответ.

IMO emit не является ни синтаксическим сахаром, ни простым ключевым словом в том смысле, что

  • Он генерирует код (как описано в @Mat выше),
  • Это помогает механизму connect распознавать, что действительно это signal и
  • Он делает вашу сигнальную часть "более крупной" системой, где сигналы и ответы (слоты) могут выполняться синхронно или асинхронно или в очереди в зависимости от того, где и как излучался сигнал. Это чрезвычайно полезная функция системы сигналов/слотов.

Вся система сигналов/слотов является другой идиомой, чем простой вызов функции. Я считаю, что это связано с шаблоном наблюдателя. Существует также большое различие между signal и a slot: сигнал не нужно реализовывать, тогда как слот должен быть!

Вы идете по улице и видите дом в огне (сигнал). Вы набираете 911 (подключите пожарный сигнал с ответным слотом 911). Сигнал был испущен, а слот был реализован пожарным департаментом. Может быть неточным, но вы получите эту идею. Рассмотрим пример OP.

Некоторые серверные объекты знают, сколько было сделано. Таким образом, это может просто сигнал emit progressNotification(...). Это зависит от класса, который отображает фактический индикатор выполнения, чтобы получить этот сигнал и выполнить его. Но как соединение соединяется с этим сигналом? Добро пожаловать в систему сигналов/слотов Qt. Теперь можно представить себе класс менеджера (обычно виджет рода), который состоит из объекта представления и объекта вычисления данных (оба являются QObjects), может выполнять connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress).

Не вдаваться в конструктивные аспекты класса менеджера, но достаточно сказать, что именно там сияет сигнальная/слотовая система. Я могу сосредоточиться на разработке очень чистой архитектуры для моего приложения. Не всегда, но часто раз, я считаю, что я просто излучаю сигналы, но реализую слоты.

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

Ответ 3

Второй вариант означает, что вы всегда знаете, что такое имя функции и параметры функции, и тот объект, который вы его отправляете, известен этой конкретной функции. Эти два случая не всегда верны, так что это две основные причины, почему шли слоты и сигналы. "под капотом" механизм сигнала и слота - это просто таблица с указателями на каждую связанную функцию.

Кроме того, посмотрите на это pdf, в котором очень четко объясняется характер механизма сигналов и слотов: http://www.elpauer.org/stuff/a_deeper_look_at_signals_and_slots.pdf