Interested Article - Сигналы и слоты
![](/images/005/303/5303161/1.jpg?rand=648135)
![](https://cdn.wafarin.com/avatars/9d073c780a69d781469f750027a9ff5e.gif)
- 2020-09-18
- 1
Сигналы и слоты — подход, используемый в некоторых языках программирования и библиотеках (например, Boost , gtkmm и Qt ) который позволяет реализовать шаблон «наблюдатель» , минимизируя написание повторяющегося кода. Концепция заключается в том, что компонент (часто виджет) может посылать сигналы, содержащие информацию о событии (например: был выделен текст «слово», была открыта вторая вкладка). В свою очередь другие компоненты могут принимать эти сигналы посредством специальных функций — слотов. Система сигналов и слотов хорошо подходит для описания графического интерфейса пользователя . Также механизм сигналов/слотов может быть применён для асинхронного ввода-вывода (включая сокеты , pipe, устройства с последовательным интерфейсом, др.) или уведомления о событиях.
Альтернативные подходы
Существуют реализации системы сигналов/слотов на основе шаблонов C++ . Их преимущество в отсутствии необходимости использовать Метаобъектный компилятор, как это реализовано в Qt . В библиотеке Qt благодаря Метаобъектному компилятору отпадает необходимость писать код регистрации/дерегистрации/вызова, так как эти шаблонные участки кода генерируются автоматически.
Примеры:
В языке программирования C# есть похожая конструкция с другой терминологией и синтаксисом: события играют роль сигналов, а делегаты — роль слотов. Другая реализация сигналов существует для , основанная на событиях из C# и сигналах/слотах из Qt. Дополнительно, делегатом может быть локальная переменная или указатель на функцию, в то время как в Qt слотом может быть только специально объявленный метод класса. Из-за ограничений языка, нет общей реализации для ANSI C. Но существует ограниченный вариант — .
Сигналы и слоты в 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)));
Ссылки
- из официальной документации Qt.
- из документации к Boost.
- William F. Humprey. . Dr. Dobb’s Journal (1 марта 2003). Дата обращения: 22 января 2014.
![](https://cdn.wafarin.com/avatars/9d073c780a69d781469f750027a9ff5e.gif)
- 2020-09-18
- 1