На этом шаге рассмотрим механизм сигналов и слотов.
Элементы графического интерфейса определенным образом реагируют на действия пользователя и посылают сообщения. Классы, описывающие объекты, способные реагировать на действия пользователей, содержат в своем описании специальный макрос - Q_OBJECT.
Cпециальный препроцессор MOC (Meta Object Compiler, метаобъектный компилятор) анализирует классы на наличие макроса Q_OBJECT в их определении и внедряет в отдельный файл всю необходимую дополнительную информацию. Это происходит автоматически, без непосредственного участия разработчика.
Подобная операция автоматического создания кода не противоречит привычному процессу программирования на C++. MOC записывает всю необходимую дополнительную информацию в отдельный файл, содержимое которого может быть проигнорировано.
Макрос Q_OBJECT должен располагаться сразу на следующей строке после ключевого слова class с определением имени класса. После макроса не должно стоять точки с запятой. Внедрять макрос в опреде-ление класса имеет смысл в тех случаях, когда созданный класс использует механизм сигналов и слотов или если ему необходима информация о свойствах.
Механизм сигналов и слотов полностью замещает старую модель функций обратного вызова, он очень гибок и полностью объектно-ориентирован. Сигналы и слоты — это краеугольный концепт программирования с использованием Qt, позволяющий соединить вместе несвязанные друг с другом объекты.
Каждый унаследованный от QObject класс способен отправлять и получать сигналы. Эта особенность идеально вписывается в концепцию объектной ориентации и не противоречит человеческому восприятию. Представьте себе ситуацию: у вас звонит телефон, и вы реагируете на это снятием трубки. На языке сигналов и слотов подобную ситуацию можно описать следующим образом: объект "телефон" выслал сигнал "звонок", на который объект "человек" отреагировал слотом "снятия трубки".
Преимущества использования механизма сигналов и слотов:
К недостаткам можно отнести:
На следующем шаге рассмотрим определение сигнала.