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



допустим, у меня есть такой сигнал:



signals:
void progressNotification(int progress);


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



emit progressNotification(1000 * seconds);


Я бы написал:



progressNotification(1000 * seconds);


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

640   3  

3 ответов:

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

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

например a 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 guard позволяет использовать Qt с другими фреймворками, которые имеют сталкивающиеся имена через no_keywords опция конфигурации QMake.)

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.