Добавить в корзинуПозвонить
Найти в Дзене
Old Programmer

Программироание на C++ (библиотека Qt). Таймер, сигналы и слоты

Весь мой канал Old Programmer здесь: Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все мои материалы о библиотеке QT. Меня уже несколько раз упрекали, что я не следую "правильному" стилю qt-приложений. В частности не использую механизм взаимодействия сигнал->слот. Но у меня подход простой: в программировании нужно уметь использовать разные механизмы. Но вот сегодня по просьбе трудящихся у меня появится и этот механизм. Кстати действительно очень удобный. Сигналы и слоты в библиотеке Qt В прошлой статье о таймере мы воспользовались тем фактам, что у визуальных объектов QT есть метод startTimer(), с помощью которого можно программно запустить таймер "внутри" это объекта и отлавливать сигналы с помощью виртуальной функции timeEvent(). Сегодня используем другой механизм: мы создадим объект класса QTimer и свяжем его сигналы с методом формы. Такие методы называются в QT слотами. Ниже представлена программа, которую мы разбили на две части: qt4010
Оглавление

Весь мой канал Old Programmer здесь: Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все мои материалы о библиотеке QT.

  • Список разделов канала Old Programmer, канала о программировании и программистах

Меня уже несколько раз упрекали, что я не следую "правильному" стилю qt-приложений. В частности не использую механизм взаимодействия сигнал->слот. Но у меня подход простой: в программировании нужно уметь использовать разные механизмы. Но вот сегодня по просьбе трудящихся у меня появится и этот механизм. Кстати действительно очень удобный.

Сигналы и слоты в библиотеке Qt

В прошлой статье о таймере мы воспользовались тем фактам, что у визуальных объектов QT есть метод startTimer(), с помощью которого можно программно запустить таймер "внутри" это объекта и отлавливать сигналы с помощью виртуальной функции timeEvent(). Сегодня используем другой механизм: мы создадим объект класса QTimer и свяжем его сигналы с методом формы. Такие методы называются в QT слотами. Ниже представлена программа, которую мы разбили на две части: qt4010.h и qt4010.cpp. Вообще то это правильно, но для не больших программ не обязательно. Но в данном случае такое разбиение обязательно, поскольку используемый в данной технологии макрос требует, чтобы определение классов располагалось в заголовочном файле.

Программа, демонстрирующая работу объекта класса QTimer

Остановимся в начале на файле qt4010.h. В нем представлено определение класса окна. Сделаю несколько пояснений:

  • Прежде всего обращаю внимание, что в начале определения класса стоит макрос Q_OBJECT. Он обязателен, если вы хотите использовать механизм сигнал->слот. Кроме того, использование такого макроса диктует отделение определений классов от их реализаций.
  • В определении класса есть private slots, где и располагаются слоты, на которые будет выходить тот или иной сигнал. В принципе эти слоты можно вызывать и как обычные методы. У нас слот один - timer(), который будет получать сигнал от таймера и выводит текущее время в поле QLineEdit.

Обратимся теперь к самой программе qt4010.cpp.

  • В конструкторе окна мы определяем его параметры, создаем поле ввода и объект таймер (QTimer). Обратим внимание, что определив интервал срабатывания таймера, мы запускаем его не в конструкторе, а в основной функции main. Я делаю на этом акцент, чтобы пояснить, что создав таймер вы можете запускать или останавливать его в нужный момент.
  • Ну и самое главное. С помощью метода connect мы соединяем сигнал таймера со слотом, определенным для класса окна. Это ключевой момент. Таким образом мы можем работать с разными сигналами от разных источников одновременно и отправлять один и тот же сигнал к разным слотам. Механизм реально очень удобный.
Рисунок в свободном доступе в Интернет
Рисунок в свободном доступе в Интернет

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

Подписывайтесь на мой канал Old Programmer и учитесь распознавать сигналы.

Но вы забыли поставить ЛАЙК, не так ли? Не порядок

Фрагмент программы qt4010.h
Фрагмент программы qt4010.h