Подробное описание технологии сигналов и слотов

Механизм сигналов и слотов играет решающую роль в разработке программ Qt. Он позволяет прикладному программисту связывать различные объекты, которые ничего не знают друг о друге. Мы уже соединяли некоторые сигналы и слоты, объяв­ляли наши собственные сигналы и слоты, реализовывали наши собственные слоты и генерировали наши собственные сигналы. Давайте рассмотрим этот механизм более подробно.

Слоты почти совпадают с обычными функциями, которые объявляются внутри классов С++ (функции-члены). Они могут быть виртуальными, они могут быть пе­регруженными, они могут быть открытыми (public), защищенными (protected) и за­крытыми (private), они могут вызываться непосредственно, как и любые другие функции-члены С++ и их параметры, могут быть любого типа. Однако слоты (в от­личие от обычных функций-членов) могут подключаться к сигналам, и в результате они будут вызываться при каждом генерировании соответствующего сигнала.

Оператор connect () выглядит следующим образом:

connect(отправитель, SIGNAL(сигнал), получатель, SL0T(слот));

где отправитель и получатель являются указателями на объекты QObj ect и где сиг­нал и слот являются сигнатурами функций без имен параметров. Макросы SIGNAL() и SL0T() фактически преобразуют свои аргументы в строковые переменные.

В приводимых ранее примерах мы всегда подключали разные слоты к разным сигналам. Существует несколько вариантов подключения слотов к сигналам.

К одному сигналу можно подключать много слотов:

connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int))); connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateStatusBarIndicator(int)));

При генерировании сигнала последовательно вызываются все слоты, причем по­рядок их вызова неопределен.

Один слот можно подключать ко многим сигналам:

connect (led, SIGNAL(overflowO),

this, SLOT(handleMathErrorO)); connect(calculator, SIGNAL(divisionByZero()),

this, SLOT(handleMathError()));

Данный слот будет вызываться при генерировании любого сигнала. Один сигнал может соединяться с другим сигналом:

connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)));

При генерировании первого сигнала будет также генерироваться второй сигнал. В остальном связь «сигнал - сигнал» не отличается от связи «сигнал - слот».


<< назад вперед >>