Введение

Сигналы и слоты — это языковая конструкция, представленная в Qt для организации взаимодействия между объектами, которая упрощает реализацию паттерна наблюдателя, избавляя от шаблонного кода. Суть заключается в том, что виджеты графического интерфейса и другие объекты могут посылать сигналы, содержащие информацию о событиях, которые могут быть приняты другими объектами с помощью специальных методов, называемых слотами. Это аналогично указателям на функции в C/C++, но система сигналов и слотов гарантирует корректность типов аргументов обратного вызова. Система сигналов и слотов хорошо сочетается с принципами проектирования графических пользовательских интерфейсов. Кроме того, её можно использовать и в других областях, не связанных с графическим интерфейсом, например, для асинхронного ввода-вывода (включая сокеты, каналы, последовательные устройства и т.д.), уведомления о событиях или для привязки событий тайм-аута к соответствующим экземплярам объектов и методам или функциям. Она проста в использовании и не требует написания кода для регистрации, отмены регистрации или вызова, поскольку метакомпилятор Qt (MOC) автоматически генерирует необходимую инфраструктуру. Например, систему обновления табличного процессора можно реализовать с помощью сигналов и слотов таким образом, чтобы при изменении ячейки её зависимые ячейки получали уведомление и обновлялись.

Альтернативные варианты реализации

Существуют некоторые реализации систем сигналов/слотов, основанные на шаблонах C++, которые не требуют дополнительного компилятора метаобъектов, как в Qt, например libsigc++, sigslot, vdk signals, nano signal slot, neosigslot, Signals, boost.signals2, Synapse, Cpp::Events, Platinum, JBroadcaster и KDBindings. Языки Common Language Infrastructure (CLI), такие как C#, также поддерживают аналогичную конструкцию, хотя и с другой терминологией и синтаксисом: события выполняют роль сигналов, а делегаты – слоты. Другая реализация сигналов существует для ActionScript 3.0, вдохновлённая событиями C# и сигналами/слотами в Qt. Кроме того, делегат может быть локальной переменной, подобно указателю на функцию, в то время как слот в Qt должен быть членом класса, объявленным соответствующим образом. Система GObject, основанная на C, также предоставляет аналогичную функциональность через GSignal. В языке D она реализована с помощью std.signals.

Библиотеки

Java: sig4j многопоточный, типобезопасный, основанный на аннотации FunctionalInterface, представленной в Java 8. C++: vdk signals потокобезопасный, типобезопасный, написанный на C++11 с использованием атомарных переменных.