Механизм сигналов и слотов

   
На этом шаге рассмотрим механизм сигналов и слотов.

   
Элементы графического интерфейса определенным образом реагируют на действия пользователя и посылают сообщения. Классы, описывающие объекты, способные реагировать на действия пользователей, содержат в своем описании специальный макрос - Q_OBJECT.

   
Cпециальный препроцессор MOC (Meta Object Compiler, метаобъектный компилятор) анализирует классы на наличие макроса Q_OBJECT в их определении и внедряет в отдельный файл всю необходимую дополнительную информацию. Это происходит автоматически, без непосредственного участия разработчика.

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

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

   
Механизм сигналов и слотов полностью замещает старую модель функций обратного вызова, он очень гибок и полностью объектно-ориентирован. Сигналы и слоты — это краеугольный концепт программирования с использованием Qt, позволяющий соединить вместе
несвязанные друг с другом объекты.

   
Каждый унаследованный от QObject класс способен отправлять и получать сигналы. Эта особенность идеально вписывается в концепцию объектной ориентации и не противоречит человеческому восприятию. Представьте себе ситуацию: у вас звонит телефон, и вы реагируете на это снятием трубки. На языке сигналов и слотов подобную ситуацию можно описать следующим образом: объект "телефон" выслал сигнал "звонок", на который объект "человек" отреагировал слотом "снятия трубки".

   
Преимущества использования механизма сигналов и слотов:

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

   
К недостаткам можно отнести:

  • сигналы и слоты не являются частью языка C++, поэтому требуется запуск дополнительного препроцессора перед компиляцией программы;
  • отправка сигналов происходит немного медленнее, чем обычный вызов функции, который производится при использовании механизма функций обратного вызова;
  • существует необходимость в наследовании класса QObject;
  • в процессе компиляции не производится никаких проверок: имеется ли сигнал или слот в соответствующих классах или нет; совместимы ли сигнал и слот друг с другом и могут ли они быть соединены вместе. Об ошибке можно будет узнать лишь тогда, когда приложение будет запущено. Вся эта информация выводится на консоль, поэтому, для того чтобы увидеть ее в Windows, в проектном файле необходимо в секции CONFIG добавить опцию console (для Linux никаких дополнительных изменений проектного файла не требуется).

   
На следующем шаге рассмотрим определение сигнала.

Предыдущий шаг
Содержание
Следующий шаг



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

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