Каковы различия между событием и сигналом в Qt

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

4 ответа

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

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

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

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

Мое впечатление о разнице заключается в следующем:

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

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

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

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

Я можно выделить 2 основные отличия, хотя вторая несколько спорно:

  1. События представляют ваше оборудование и представляют собой небольшой конечный набор. Сигналы представляют вашу логику уровня виджетов и могут быть сколь угодно сложными и многочисленными.

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам