Что такое сигналы и слоты?

23
задан bdesham 10 February 2015 в 20:56
поделиться

4 ответа

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

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

, Так как этим вопросом был отмеченный C++, вот ссылка на эти Повышение. Сигналы библиотека, которая имеет намного более полное объяснение.

26
ответ дан 29 November 2019 в 01:30
поделиться

Я думаю, что можно описать сигналы и слоты лучше всего, когда Вы смотрите на них как на возможный механизм реализации для Шаблон "наблюдатель" или Публикуете/Подписчик Шаблон . Существует один signal, например buttonPressed(IdType) на Стороне Издателя. Каждый раз, когда кнопка нажимается, все слоты, которые подключены к тому сигналу, называют. Слоты находятся на Абонентской стороне. Слот мог, например, быть sendMail(IdType).

Наряду с событием "кнопка, нажатая", слот знал бы, какая кнопка была нажата, так как идентификатор будет передан. IdType представляет тип данных, отправленных по соединению между Издателем и Подписчиком. Операция, возможная для Подписчика, была бы connect(signal, slot), который мог соединиться buttonPressed(IdType) с sendMail(IdType), так, чтобы, если кнопка нажимается, которым называют конкретный слот.

хорошая вещь об этом состоит в том, что подписчик (сторона слота) не должен заботиться о деталях сигнала. Это просто должно соединиться. Таким образом здесь у нас есть много из [1 110] слабая связь . Можно изменить реализацию кнопок, но интерфейс для слотов все еще был бы тем же.

Взгляд Сигналы Повышения Сигналов/Слотов или кварты для большей информации.

14
ответ дан 29 November 2019 в 01:30
поделиться

Я предполагаю, что Вы говорите о сигналах и слотах QT.
Это очень просто.

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

лучший способ проиллюстрировать с примером.
класс QPushButton имеет сигнал QPushButton:: нажатый (). Тот сигнал запущен каждый раз, когда кнопка нажата. Кнопка не должна знать, кому интересно знать, что щелчок произошел. это просто запускает сигнал и кому бы ни интересно, может соединиться с ним.
QDialog, в котором кнопка помещается в, заражают заинтересованный для знания, когда кнопка была нажата. Это имеет слот MyDialog:: buttonClicked (). На MyDialog c'tor необходимо соединиться (), щелчок кнопок () предупреждает buttonClicked диалогового окна () о слоте так, чтобы слот назвали, когда сигнал будет запущен.

набор А более усовершенствованного материала:

  • Аргументы, сигнал может иметь аргументы, и эти аргументы могут дополнительно быть переданы слоту также.
  • крест распараллеливает вызовы - Если Вы установите связь слота сигнала, которая должна быть перекрестным потоком затем, то QT автоматически буферизует сигналы и поставит их в очередь к правильному потоку. Это происходит автоматически, например, когда поток GUI должен связаться с рабочим потоком.

Вот больше информации в документации QT.

4
ответ дан 29 November 2019 в 01:30
поделиться

Предположите иметь GUI в своем приложении. Большую часть времени поток управления не был бы очень линеен, т.е. вместо того, чтобы иметь ясную последовательность действий, у Вас будет пользователь, который взаимодействует с GUI (кнопки Мне нравится, меню и т.д.).

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

Вот пример: предположите, что у Вас есть флажок, представленный как объект на Вашем языке программирования. Несколько вещей могут произойти с тем флажком: это может быть переключено, который в свою очередь также означает, что это или установлено или сброшено. Это - сигналы, которые это может испустить. Мы назовем их checkboxToggled, checkboxSet и checkboxUnset. Как Вы видите в этом примере, флажок будет всегда испускать сигнал checkboxToggled при переключении, но также и точно один из двух других сигналов, в зависимости от как изменения состояния.

Теперь предполагают иметь некоторые другие объекты, а именно, маркировка, которая ради этого примера всегда существует как объект, но может "появиться" и "исчезнуть" и системный звуковой сигнал (также представленный объектом), который может просто подать звуковой сигнал. Это - слоты, которые имеют те объекты. Мы назовем их "messageAppear", "messageDisappear" и "звуковым сигналом".

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

Вы таким образом подключили бы следующие сигналы к следующим слотам (сигналы слева, слоты справа):

checkboxToggled -> beep
checkboxSet -> messageAppear
checkboxUnset -> messageDisappear

Это - в основном это.

сигналы и слоты могут также иметь аргументы. Например, с помощью ползунка, который устанавливает численное значение, требуется отправить измененное значение наряду с испускаемым сигналом, как только пользователь переместил ползунок: sliderChanged (интервал).

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

Имеют в виду, что сигналы и слоты часто симметричны в том смысле, что может часто быть сигнал, соответствующий слоту. Например, флажок может испустить сигнал при переключении, но он может также содержать слот, который переключает сам флажок. Было бы легко реализовать для разделения флажков, которые всегда устанавливаются противоположно друг на друга.

6
ответ дан 29 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: