Работа с таймером в Qt5
Запрограммируем движение кнопки по горизонтали. Пуск и пауза такого процесса будут инициироваться кликом по этой самой кнопке. После первого клика кнопка каждую секунду будет смещаться вправо на 10 единиц.
В заголовочный файл mainwindow.h добавим:
а) строку #include <QTimer>;
б) в описание класса MainWidow
1 |
QTimer* timer; |
и слоты
1 2 |
void do_timer(); void on_pushButton_clicked(); |
Полный код mainwindow.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include <QTimer> // для таймера namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); //www.itmathrepetitor.ru private slots: void on_pushButton_clicked(); void do_timer(); private: Ui::MainWindow *ui; QTimer* timer; }; #endif // MAINWINDOW_H |
В файле mainwindow.cpp добавим в конструктор MainWindow::MainWindow(QWidget *parent) код создания таймера и связку стандартного сигнала timeout() и нашего слота do_timer().
1 2 |
timer=new QTimer; connect(timer,SIGNAL(timeout()),this,SLOT(do_timer())); |
Теперь таймер будет периодически вызывать код слота do_timer(). Период определяется в миллисекундах при вызове таймера с помощью метода start(int msec). Еще пригодятся функция isActive(), возвращающая true, если таймер включен, и функция stop().
1 2 3 4 5 6 7 |
void MainWindow::on_pushButton_clicked() { if (!timer->isActive()) timer->start(50); else timer->stop(); } |
Осталось определить, что будет происходить каждые 50 миллисекунд после включения таймера:
1 2 3 4 |
void MainWindow::do_timer() { ui->pushButton->move(QPoint( ui->pushButton->pos().x()+10, ui->pushButton->pos().y())); } |
Как видим, кнопка перемещается в новую точку, координата x которой на 10 больше соответствующей координаты до перемещения.
При движении кнопки, то есть при работе таймера, форма не зависает и по-прежнему доступна для команд пользователя. Другими словами, таймер работает асинхронно.
Задача решена.
Класс QTimer содержит статический метод singleShot(), с помощью которого можно запустить таймер без создания объекта.
В Qt5 есть еще встроенный таймер в QObject, поэтому каждый класс, унаследованный от QObject, допускает вызов метода QObject::startTimer().