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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

enter image description here

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

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

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

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

Я могу отличить 2 основных отличия, хотя второй из них несколько спорный:

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

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

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

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

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

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

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

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

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

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

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