Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Qt.docx
Скачиваний:
9
Добавлен:
15.09.2019
Размер:
52.86 Кб
Скачать

Сигналы.

В программировании с использованием QT под сигналами (signals) подразумеваются методы, которые в состоянии производить высылку сообщений.

Причиной для появления сигнала может быть сообщение об изменении состояния управляющего элемента, например, перемещение ползунка.

На подобные изменения подсоединенный объект, отслеживающий эти сигналы может соответственно отреагировать, хотя это и не обязательно.

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

Благодаря такому разделению можно разбить большой проект на компоненты, которые будут разрабатываться разными программистами в отдельности, а потом соединятся при помощи сигналов и слотов вместе. Это делает код очень гибким и легко расширяемым.

Сигналы определяются в классе, как и обычные методы, только без реализации.

Сигналы являются только прототипами методов, содержащихся в заголовочном файле определения класса. Всю дальнейшую заботу о реализации кода для этих методов берет на себя MOC. Методы сигналов не должны возвращать какое-либо значение. И поэтому перед именем методом всегда должно стоять VOID.

Сигнал не обязательно соединяется слотом. Если соединение не произошло, то он просто не будет обрабатываться.

Не имеет смысла определять сигналы, как private, protected или public, т.к. они играют толь вызывающих методов. Вызвать сигнал можно при помощи ключевого слова emit.

Сигналы могут высылаться из классов, которые их содержат.

Чтобы появилась возможность отсылать сигнал, программно из объекта этого класса, следует добавить метод SendSignal().

Сигналы также имеют возможность высылать информацию, передаваемую в параметре.

Высылку сигналов можно заблокировать на некоторое время вызовом метода blockSignals() с параметром true. При этом объект будет молчать, пока блокировка не будет снята тем же методом blockSignals() с параметром false.

Слоты

Слоты – это методы, которые присоединяются к сигналам; это функция, которая вызывается в ответ на определенный сигнал.

По сути, они являются обычными методами. Самое большое их отличие состоит в способности принимать сигналы. Как и обычные методы они представляются в классе, как public, private или protected.

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

Внутри слота вызовом метода sender можно указать от какого объекта был выслан сигнал. Он возвращает указатель на объект типа Q_OBJECT.

Так же как объект не знает ничего о получателях своих сигналов, слот ничего не знает о сигналах, которые к нему подключены. Это гарантирует, что полностью независимые компоненты могут быть созданы с помощью Qt.

Мы можем подключать к одному слоту столько сигналов, сколько захотим, также один сигнал может быть подключен к стольким слотам, сколько необходимо. Класс QSignalMapper необходим в ситуациях, когда много сигналов подключены к одному и тому же слоту, и этот слот должен реагировать на каждый сигнал по-разному.

По сравнению с обратными вызовами, сигналы и слоты слегка медленнее из-за увеличенной гибкости, которую они обеспечивают, хотя разница для реальных приложений незаметна.

В некоторых случаях может потребоваться информация об отправителе сигнала. Qt предоставляет функцию Qobject::sender(), которая возвращает указатель на объект, пославший сигнал.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]