Представьте, что в вашем приложении есть графический интерфейс. В большинстве случаев поток управления не будет очень линейным, то есть вместо четкой последовательности действий у вас будет пользователь, взаимодействующий с GUI (например, кнопки, меню и т. Д.).
По сути, это модель, управляемая событиями, которая может быть реализована с помощью шаблона сигналов и слотов. сигналы - это события, которые генерируются объектами (например, компонентами GUI), а слоты являются приемниками этих событий.
Вот пример: представьте, что у вас есть флажок, представленный в виде объекта на вашем языке программирования. С этим флажком может произойти несколько вещей: он может быть переключен, что, в свою очередь, также означает, что он установлен или не установлен. Это сигналы, которые он может излучать. Мы назовем их checkboxToggled, checkboxSet и checkboxUnset. Как вы видите, в этом примере флажок всегда будет издавать сигнал checkboxToggled при переключении, но также точно один из двух других сигналов, в зависимости от того, как изменяется состояние.
Теперь представьте, что у вас есть некоторые другие объекты, а именно метка, которая в этом примере всегда существует как объект, но может «появляться» и «исчезать», и системный звуковой сигнал (также представленный объектом), который может звуковой сигнал. Это слоты, которые имеют эти объекты. Мы будем называть их «messageAppear», «messageDisappear» и «beep».
Предположим, вы хотите, чтобы системный звуковой сигнал издавал звуковой сигнал при каждом переключении флажка, а метка появлялась или исчезала в зависимости от того, установил ли пользователь флажок или снял его.
Таким образом, вы должны подключить следующие сигналы к следующим слотам (сигналы слева, слоты справа):
checkboxToggled -> beep
checkboxSet -> messageAppear
checkboxUnset -> messageDisappear
Вот и все.
сигналы и слоты также могут иметь аргументы. Например, используя ползунок, который устанавливает числовое значение, вы хотите отправить измененное значение вместе с излучаемым сигналом, как только пользователь переместит ползунок: sliderChanged (int).
Конечно, чтобы действительно сделать что-то полезное, вы бы написали несколько собственных классов, которые содержали бы некоторые собственные сигналы и слоты. Это делается довольно легко, и с помощью этих собственных сигналов и слотов у вас есть хороший способ взаимодействия с GUI или другими частями вашего кода управляемым событиями образом.
Имейте в виду, что сигналы и слоты часто симметричны в том смысле, что часто может быть сигнал, соответствующий слоту. Например, флажок может испускать сигнал при переключении, но он также может содержать слот, который переключает сам флажок. Было бы легко реализовать отдельные флажки, которые всегда установлены напротив друг друга.