На этом шаге рассмотрим метод connect() для соединения объектов.
Соединение объектов осуществляется при помощи статического метода connect(), который определен в классе QObject.
В общем виде, вызов метода connect() выглядит следующим образом:
QObject::connect(const QObject* sender, const char* signal, const QObject* receiver, const char* slot, Qt::ConnectionType type = Qt::AutoConnection );
Параметры:
Следующий пример демонстрирует то, как может быть осуществлено соединение объектов в программе.
void main() { ... QObject::connect(pSender, SIGNAL(signalMethod()), pReceiver, SLOT(slotMethod()) ); ... }
Если вызов происходит из класса, унаследованного от QObject, тогда QObject:: можно опустить:
MyClass ::MyClass() : QObject() { ... connect(pSender, SIGNAL(signalMethod()), pReceiver, SLOT(slotMethod()) ); ... }
В случае если слот содержится в классе, из которого производится соединение, то можно воспользоваться сокращенной формой метода connect(), опустив третий параметр (pReceiver), указывающий на объект-получатель. Другими словами, если в качестве объекта-получателя должен стоять указатель this, его можно просто не указывать:
MyClass::MyClass() : QObject() { connect(pSender, SIGNAL(signalMethod()), SLOT(slot())); } void MyClass::slot() { qDebug() << "Я слот"; }
Иногда возникают ситуации, когда объект не обрабатывает сигнал, а просто передает его дальше. Для этого необязательно определять слот, который в ответ на получение сигнала (при помощи emit) отсылает свой собственный. Можно просто соединить сигналы друг с другом. Отправляемый сигнал должен содержаться в определении класса:
MyClass::MyClass() : QObject() { connect(pSender, SIGNAL(signalMethod()), SIGNAL(mySignal())); }
Отправку сигналов можно заблокировать на некоторое время, вызвав метод blockSignals() с параметром true. Объект будет "молчать", пока блокировка не будет снята тем же методом blockSignals() с параметром false.
При помощи метода signalsBlocked() можно узнать текущее состояние блокировки сигналов.
Слот, не имеющий параметров, можно соединить с сигналом, имеющим параметры. Это удобно, когда сигналы поставляют больше информации, чем требуется для объекта, получающего сигнал. В этом случае в слоте можно не указывать параметры:
MyClass::MyClass() : QObject() { connect(pSender, SIGNAL(signalMethod(int)), SIGNAL(mySignal())); }
Если вы не уверены, пригодится ли параметр сигнала в будущем, то лучше определить слот с параметром и проигнорировать его внутри слота. Зато потом, когда возникнет необходимость, вам не потребуется менять прототип слота.
На следующем шаге рассмотрим пример, демонстрирующий механизм сигналов и слотов.