У меня сложилось впечатление, что разница выглядит следующим образом:
![enter image description here](https://i.stack.imgur.com/tFfuo.png)
Допустим, у вас есть серверное устройство, выполняется бесконечный цикл, прослушивание некоторых внешних событий клиента и реакция на нихвыполнение некоторого кода.
(Это может быть процессор, прослушивающий прерывания от устройств или код браузера Javascript на стороне клиента, ограниченный для кликов пользователей или кода веб-сайта на стороне сервера, прослушивающий пользователей, запрашивающих веб-страницы или данные).
Или это может быть ваше приложение Qt, выполняющее свой основной цикл.
Я объясню с предположением, что вы используете Qt в Linux с X-сервером, используемым для рисования.
1013 * Я могу выделить 2 основные отличия, хотя второй один несколько спорно:
- События представляют ваше оборудование и небольшое конечное множество.Сигналы представляют вашу логику на уровне виджетов и могут быть произвольно сложными и многочисленными.
События - это низкоуровневые сообщения, приходящие к вам от клиента.Набор событий представляет собой строго ограниченный набор (~ 20 различных типов событий), определяемый аппаратно (например, щелчок мышью / двойной щелчок / нажатие / отпускание, перемещение мыши, нажатие / отпускание / удерживание клавиши клавиатуры и т. Д.) И указанный в протоколе.взаимодействия (например, протокола X) между приложением и пользователем.
Например, во время создания протокола X не было жестов с несколькими касаниями, были только мышь и клавиатура, поэтому протокол X не будет понимать ваши жестыи отправить их в приложение, он будет интерпретировать их как щелчки мыши.Таким образом, расширения для протокола X вводятся с течением времени.
X-события ничего не знают о виджетах, виджеты существуют только в Qt. X-события знают только о X-окнах, которые являются очень простыми прямоугольниками, которыеваши виджеты состоят из.Ваши события Qt являются лишь тонкой оболочкой для событий X / Windows / Mac, обеспечивая уровень совместимости между различными собственными событиями операционных систем для удобства авторов уровня логики уровня Widget.
Логика уровня виджета имеет дело с сигналами, потому что они включают значение ваших действий на уровне виджета.Кроме того, один сигнал может быть запущен из-за различных событий, например, щелчок мышью по кнопке меню «Сохранить» или сочетание клавиш, такое как Ctrl-S .
Говоря абстрактно (это не совсем относится к Qt!), События асинхронны по своей природе, а сигналы (или хуки в других терминах) синхронны.
Скажем, у вас есть функция foo(), который может запустить сигнал ИЛИ выдать событие.Если он запускает сигнал, Сигнал выполняется в том же потоке кода, что и вызвавшая его функция, сразу после функции .
С другой стороны, если он генерирует событие, Событие отправляется в основной цикл, и оно зависит от основного цикла, когда он доставляет это событие на принимающую сторону и что происходит дальше.
Таким образом, 2 последовательных события могут даже быть доставлены в обратном порядке.порядок, в то время как 2 последовательно сработавших сигнала остаются последовательными.
Хотя терминология не является строгой.«Singals» в Unix как средство межпроцессного взаимодействия лучше называть «Events», потому что они асинхронные: вы вызываете сигнал в одном процессе и никогда не знаете, когда цикл обработки событий переключится на процесс получения и выполнит обработчик сигнала.
PS Пожалуйста, прости меня, если некоторые из моих примеров не совсем верны с точки зрения буквы.Они все еще хороши с точки зрения духа.