Разработка приложений на Qt. Часть 5 — Механизм сигналов и слотов

Механизм сигналов и слотов является одной из фундаментальных концепций всей библиотеки Qt. Он представляет собой способ коммуникации между различными объектами вашего приложения.

И все как в реальной жизни. Звонит будильник (сигнал) — вы выключаете его (слот). В дверь могут позвонить или постучать (два сигнала) результат один — вы пойдете открывать дверь (слот). Любое количество сигналов может быть связано с любым количество слотов. Закипел чайник (сигнал) — вы берете кружку, насыпаете туда кофе, сахар, молоко, заливаете водой (пять слотов). Причем комбинация этих слотов может быть абсолютно любой и какой-то из слотов можно исключить для получения иного результата.

abstract-connections

Все это очень похоже на концепцию функций обратного вызова (callback). Но они плохи тем, что во первых нетипобезопасны, во вторых callback’и жестко привязаны к функции их вызывающей. Между тем, в Qt имеются события но они используются в ином контексте. Об этом будет остальная статья.

Вернемся к нашему первому проекту. Сейчас я покажу как сигналы и слоты реализуются в коде, и сразу станет все понятно. По нашей задумке, текст из поля ввода над кнопкой должен попадать в метку под кнопкой. Для начала необходимо создать слот (забегая вперед скажу, что сигнал у нас уже есть и создавать его не надо), откроем widget.h и добавим после секции private секцию public slots:

Здесь мы объявили слот copyTextToLabel(). Воспринимайте слот как еще один метод класса.

Теперь добавим реализацию слота, перейдем в windget.cpp и между конструктором и деструктором напишем:

Итак, что здесь происходит. Как я писал ранее, виджеты как экземпляры соответствующих классов имеют поля и методы. Здесь мы взаимодействуем с методом setText виджета label. Он устанавливает текст в метку. А текст этот он берет из поля text виджета lineEdit принимая его как входной параметр. Поэтому все что бы мы не написали в lineEdit будет при нажатии кнопки уходить в label.

Но это еще не все. Слот создан. Теперь надо каким-то образом связать кнопку с выполнением этого куска кода. Этой связью занимается функция connect. И все коннекты мы обязаны определить в конструкторе, до того как пользователь начнет взаимодействовать с программой. Осталось узнать какой сигнал использовать. В этом нам могут помочь две вещи: документация и среда Qt Creator. При создании связи connect, Qt Creator подскажет какие имеются у объекта доступные сигналы.

qt_creator_5_1

В нашем случае нас интересует нажатие на кнопку, а это сигнал clicked(). Итак напишем последней строчкой в конструкторе в widget.cpp:

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

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

qt_creator_5_2

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

3 Комментариев

  1. Очень доходчиво, не ожидал что настолько доступно можно объяснять сложные вещи.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *