Подробное описание технологии сигналов и слотов
Механизм сигналов и слотов играет решающую роль в разработке программ 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 &)));
При генерировании первого сигнала будет также генерироваться второй сигнал. В остальном связь «сигнал - сигнал» не отличается от связи «сигнал - слот».
<< назад вперед >>