Использование таймеров

Таймеры позволяют через определенный интервал времени выполнять метод с предопределенным названием timerEvent(). Для назначения таймера используется метод startTimer() из класса QObject. Прототипы метода:

int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
int startTimer(std::chrono::milliseconds time,
               Qt::TimerType timerType = Qt::CoarseTimer)

Метод startTimer() возвращает идентификатор таймера, с помощью которого можно остановить таймер. Первый параметр задает промежуток времени в миллисекундах, по истечении которого выполняется метод timerEvent(). Прототип метода:

virtual void timerEvent(QTimerEvent *event)

Внутри метода timerEvent() можно получить идентификатор таймера с помощью метода timerId() объекта класса QTimerEvent. Прототип метода:

int timerId() const

Минимальное значение интервала зависит от операционной системы. Если в первом параметре указать значение 0, то таймер будет срабатывать много раз при отсутствии других необработанных событий.

Чтобы остановить таймер, необходимо воспользоваться методом killTimer() из класса QObject. Прототип метода:

void killTimer(int id)

В качестве параметра указывается идентификатор, возвращаемый методом startTimer().

Создадим часы в окне, которые будут отображать текущее системное время с точностью до секунды, и добавим возможность запуска и остановки часов с помощью кнопок. Содержимое файла widget.h приведено в листинге 4.12, файла widget.cpp — в листинге 4.13, а файла main.cpp — в листинге 4.14.

Листинг 4.12. Содержимое файла widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QTimerEvent>
#include <QTime>

class Widget : public QWidget
{
   Q_OBJECT

public:
   Widget(QWidget *parent=nullptr);
   ~Widget();
protected:
   void timerEvent(QTimerEvent *event) override;
private slots:
   void on_btn1_clicked();
   void on_btn2_clicked();
private:
   QLabel *label;
   QPushButton *btn1;
   QPushButton *btn2;
   QVBoxLayout *vbox;
   int timer_id;
};
#endif // WIDGET_H

Листинг 4.13. Содержимое файла widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
   : QWidget(parent)
{
   timer_id = -1;
   label = new QLabel("");
   label->setAlignment(Qt::AlignCenter);
   btn1 = new QPushButton("Запустить");
   btn2 = new QPushButton("Остановить");
   btn2->setEnabled(false);
   vbox = new QVBoxLayout();
   vbox->addWidget(label);
   vbox->addWidget(btn1);
   vbox->addWidget(btn2);
   setLayout(vbox);
   connect(btn1, SIGNAL(clicked()),
           this, SLOT(on_btn1_clicked()));
   connect(btn2, SIGNAL(clicked()),
           this, SLOT(on_btn2_clicked()));
}

void Widget::on_btn1_clicked()
{
   timer_id = startTimer(1000); // 1 секунда
   btn1->setEnabled(false);
   btn2->setEnabled(true);
}

void Widget::on_btn2_clicked()
{
   if (timer_id != -1) {
      killTimer(timer_id);
      timer_id = -1;
   }
   btn1->setEnabled(true);
   btn2->setEnabled(false);
}

void Widget::timerEvent(QTimerEvent *event)
{
   // qDebug() << "ID =" << event->timerId();
   QTime t = QTime::currentTime();
   label->setText(t.toString("HH:mm:ss"));
}

Widget::~Widget() {}

Листинг 4.14. Содержимое файла main.cpp

#include "widget.h"

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Widget window;
   window.setWindowTitle("Часы в окне");
   window.resize(350, 100);
   window.show();
   return app.exec();
}

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов