Использование emit vs вызов сигнала, как если бы это была обычная функция в Qt
допустим, у меня есть такой сигнал:
signals:
void progressNotification(int progress);
Я только недавно узнал о ключевом слове emit в Qt. До сих пор я выполнял сигналы, просто вызывая их как обычную функцию. Так что вместо:
emit progressNotification(1000 * seconds);
Я бы написал:
progressNotification(1000 * seconds);
вызов их таким образом, казалось, работал, и все связанные слоты выполнялись бы, так что использование ключевого слова emit вызывает другое поведение, или это просто синтаксический сахар?
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не является ни синтаксическим сахаром, ни простым ключевым словом в том смысле, что
- он генерирует код (как описано @Mat выше),
- помогает
connectмеханизм распознает, что действительно этоsignalи- это делает ваш сигнал частью "большой" системы, где сигналы и ответы (слоты) может выполняться синхронно или асинхронно, или в очереди, в зависимости от того, где и как был испущен сигнал. Это чрезвычайно полезная функция системы сигнал / слот.
вся система сигналов / слотов-это другая идиома, чем простой вызов функции. Я считаю, что это связано с моделью наблюдателя. Существует также большая разница между
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