Каковы различия между событием и сигналом в Qt - PullRequest
18 голосов
/ 17 февраля 2012

Мне трудно понять разницу между сигналами и событиями в Qt, кто-то может объяснить?

Ответы [ 4 ]

11 голосов
/ 17 февраля 2012

Событие - это сообщение , инкапсулированное в класс (QEvent), которое обрабатывается в цикле событий и отправляется получателю, который может принять сообщение или передать его.вместе с другими, чтобы обрабатывать.Они обычно создаются в ответ на внешние системные события, такие как щелчки мыши.

Сигналы и слоты - это удобный способ для QObject s общаться друг с другом и больше похожи на функции обратного вызова .В большинстве случаев, когда испускается «сигнал», любая функция слота, связанная с ним, вызывается напрямую.Исключение составляют случаи, когда сигналы и слоты пересекают границы потоков.В этом случае сигнал по существу будет преобразован в событие.

6 голосов
/ 17 февраля 2012

События - это то, что произошло до или внутри объекта В общем, вы должны обрабатывать их в собственном коде класса объекта.

Сигналы испускаются объектом. Объект в основном уведомляет другие объекты о том, что что-то произошло. Другие объекты могут сделать что-то в результате или нет, но эмитент не должен справляться с этим.

2 голосов
/ 07 февраля 2015

У меня сложилось впечатление, что разница выглядит следующим образом:

enter image description here

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

(Это может быть процессор, прослушивающий прерывания от устройств или код браузера Javascript на стороне клиента, ограниченный для кликов пользователей или кода веб-сайта на стороне сервера, прослушивающий пользователей, запрашивающих веб-страницы или данные).

Или это может быть ваше приложение Qt, выполняющее свой основной цикл.

Я объясню с предположением, что вы используете Qt в Linux с X-сервером, используемым для рисования.

1013 * Я могу выделить 2 основные отличия, хотя второй один несколько спорно:
  1. События представляют ваше оборудование и небольшое конечное множество.Сигналы представляют вашу логику на уровне виджетов и могут быть произвольно сложными и многочисленными.

События - это низкоуровневые сообщения, приходящие к вам от клиента.Набор событий представляет собой строго ограниченный набор (~ 20 различных типов событий), определяемый аппаратно (например, щелчок мышью / двойной щелчок / нажатие / отпускание, перемещение мыши, нажатие / отпускание / удерживание клавиши клавиатуры и т. Д.) И указанный в протоколе.взаимодействия (например, протокола X) между приложением и пользователем.

Например, во время создания протокола X не было жестов с несколькими касаниями, были только мышь и клавиатура, поэтому протокол X не будет понимать ваши жестыи отправить их в приложение, он будет интерпретировать их как щелчки мыши.Таким образом, расширения для протокола X вводятся с течением времени.

X-события ничего не знают о виджетах, виджеты существуют только в Qt. X-события знают только о X-окнах, которые являются очень простыми прямоугольниками, которыеваши виджеты состоят из.Ваши события Qt являются лишь тонкой оболочкой для событий X / Windows / Mac, обеспечивая уровень совместимости между различными собственными событиями операционных систем для удобства авторов уровня логики уровня Widget.

Логика уровня виджета имеет дело с сигналами, потому что они включают значение ваших действий на уровне виджета.Кроме того, один сигнал может быть запущен из-за различных событий, например, щелчок мышью по кнопке меню «Сохранить» или сочетание клавиш, такое как Ctrl-S .

Говоря абстрактно (это не совсем относится к Qt!), События асинхронны по своей природе, а сигналы (или хуки в других терминах) синхронны.

Скажем, у вас есть функция foo(), который может запустить сигнал ИЛИ выдать событие.Если он запускает сигнал, Сигнал выполняется в том же потоке кода, что и вызвавшая его функция, сразу после функции .

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

Таким образом, 2 последовательных события могут даже быть доставлены в обратном порядке.порядок, в то время как 2 последовательно сработавших сигнала остаются последовательными.

Хотя терминология не является строгой.«Singals» в Unix как средство межпроцессного взаимодействия лучше называть «Events», потому что они асинхронные: вы вызываете сигнал в одном процессе и никогда не знаете, когда цикл обработки событий переключится на процесс получения и выполнит обработчик сигнала.

PS Пожалуйста, прости меня, если некоторые из моих примеров не совсем верны с точки зрения буквы.Они все еще хороши с точки зрения духа.

2 голосов
/ 17 февраля 2012

Событие передается непосредственно в метод обработчика события класса. Они доступны для вас, чтобы перегружать ваши подклассы и выбирать, как обрабатывать событие по-другому. События также передаются по цепочке от дочернего к родительскому, пока кто-то не справится с этим, или он не упадет до конца.

С другой стороны, сигналы излучаются открыто, и любой другой объект может подключиться и прослушать их. Они проходят через циклы событий и обрабатываются в очереди (они также могут обрабатываться напрямую, если они находятся в одном потоке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...