пятница, 1 марта 2013 г.

Сигналы и слоты в Qt

Сигналы и слоты в Qt - это механизм, который используются для взаимодействия между несколькими объектами. Фактически, сигналы и слоты помогают нам реализовать шаблон "Наблюдатель" (скоро описание этого шаблона будет добавлено в блог, если в скором времени не появится, пинайте меня, в C# это интерфейс System.IObserver<T>, в бусте boost.signals). Эта особенность существенно различает Qt от других библиотек.

Основная идея слотов и сигналов:
Когда событие происходит, то вырабатывается сигнал, который посылается на слот, слот это обработчик сигналов, фактически, это обычный метод класса (их даже можно делать виртуальными), который определяется после идентификатора public slots.
Предположим, что у нас есть класс MyClass:
(Не забываем, что для использования этого механизма нужен специальный макрос Q_OBJECT, который должен быть определен в теле класса, к тому же только классы наследуемые от QObject могут содержать слоты и сигналы, поэтому сделаем наследование
/////////////////////////////////////////////////////
class MyClass : public QObject {
    Q_OBJECT
//Определение
}
////////////////////////////////
Начнем с сигналов:
Как было сказано это тоже обычные методы:
////////////////////////////////////////////////////
class MyClass: public QObject {
Q_OBJECT
public:
...
signals:
   void mySignal();
};
///////////////////////////////
Для выработки сигнала используем ключевое слово emit:
/////////////////////////////////////////////////////////////////////////////////
void MyClass ::sendMySignal()
{
   emit mySignal();
}
/////////////////////////////////////////////////
Хочу сказать, что сигналы автоматически определяются и их НЕ НАДО определять, просто оставляем объявление.
Теперь слоты:
Как видим слоты - это обычные методы, у них есть определение, в отличие от сигналов, все они размещаются после ключевого слова - slots,причем мы указываем для них уровень доступа. Также можно добавлять аргументы (этот пример без аргумента)
/////////////////////////////////////////////////////////////////////////////////////////////
class MyClass: public QObject {
Q_OBJECT
 
public slots:
   void mySlot()
   {
      ...
   }
};
///////////////////////////////////////////////////////
Соединение сигнала и слота:
Для соединения сигнала и слота мы используем метод connect(sender, SIGNAL(signal), receiver, SLOT(slot))
Для нашего примера (т.е. сигнал и слот выше имена):
connect(sender, SIGNAL(MySignal()), receiver, SLOT(MySlot()));
Благодаря этому, при возникновении сигнала MySignal() автоматически вызовется метод MySlot(), который обработает сигнал MySignal().

0 коммент.:

Отправить комментарий