Сигналы и слоты — подход, используемый в некоторых языках программирования и библиотеках (например, Boost, gtkmm и Qt), который позволяет реализовать шаблон «наблюдатель», минимизируя написание повторяющегося кода. Концепция заключается в том, что компонент (часто виджет) может посылать сигналы, содержащие информацию о событии (например: был выделен текст «слово», была открыта вторая вкладка). В свою очередь другие компоненты могут принимать эти сигналы посредством специальных функций — слотов. Система сигналов и слотов хорошо подходит для описания графического интерфейса пользователя. Также механизм сигналов/слотов может быть применён для асинхронного ввода-вывода (включая сокеты, pipe, устройства с последовательным интерфейсом и др.) или уведомления о событиях.
Альтернативные подходы
Существуют реализации системы сигналов/слотов на основе шаблонов C++. Их преимущество - в отсутствии необходимости использовать метаобъектный компилятор, как это реализовано в Qt. В библиотеке Qt благодаря Метаобъектному компилятору отпадает необходимость писать код регистрации/дерегистрации/вызова, так как эти шаблонные участки кода генерируются автоматически.
Примеры: (Используется в gtkmm, C++ оболочке над Gtk+); sigslot; Signals; boost.signals2; Cpp::Events; Platinum; JBroadcaster.
В языке программирования C# есть похожая конструкция с другой терминологией и синтаксисом: события играют роль сигналов, а делегаты — роль слотов. Другая реализация сигналов существует для ActionScript 3.0, основанная на событиях из C# и сигналах/слотах из Qt. Дополнительно делегатом может быть локальная переменная или указатель на функцию, в то время как в Qt слотом может быть только специально объявленный метод класса. Из-за ограничений языка нет общей реализации для ANSI C. Но существует ограниченный вариант — c-sigslot.
Сигналы и слоты в Qt (C++) Создать сигнал в классе можно так:class A : public QObject { Q_OBJECT public: A(); signals: void someSignal(); /* ... */ };Слот можно создать так:class B : public QObject { Q_OBJECT public: B(); public slots: void someSlot(); /*...*/ };Чтобы соединить сигнал и слот:A classA(); B classB();
QObject::connect(&classA, SIGNAL(someSignal(int)), &classB, SLOT(someSlot(int)));
Ссылки Signals and slots из официальной документации Qt. Signals and slots из документации к Boost.
Категория:Qt