Немного поговорим о применении класса QTimer в Qt. Это небольшая легкая тема после серии объемных статей про QSqlTabelModel и вытекающих из неё последствий. А то уже у самого серое вещество закипает.
Таймеры нам могут понадобиться для создания опроса устройств по ЛВС через стек TCP/IP с определенной периодичностью или для ежечасной проверки данных или активных подключений к серверу. Да для чего угодно!? И тут нам на помощь приходит QTimer, который Мы рассмотрим на примере ежесекундного вывода времени в QLabel.
Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.
Структура проекта для QTimer
Используем минимум файлов в нашем проекте:
- QDataMapperWidget.pro - профайл;
- mainwindow.h - заголовочный файл основного окна приложения;
- mainwindow.cpp - исходный код окна;
- main.cpp - основной исходный файл, с которого стартует приложение;
- mainwindow.ui - формочка основного окна приложения;
- А формочку нарисуем в Дизайнере QtCreator. Впрочем там и рисовать нечего. Кинули QLabel в середину и готово.
mainwindow.h
Всё, что нам надо для счастья в этом проекте - это слот, который будет реагировать на срабатывание QTimer, да сам объекта этого класса.
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- #include <QFont>
- #include <QTimer>
- #include <QTime>
- namespace Ui {
- class MainWindow;
- }
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~MainWindow();
- /* Будем использовать только один слот */
- private slots:
- void slotTimerAlarm();
- private:
- Ui::MainWindow *ui;
- /* Да сам объект QTimer */
- QTimer *timer;
- };
- #endif // MAINWINDOW_H
mainwindow.cpp
А теперь несколько строчек по запуску таймера. По-моему комментариев больше, чем кода. Обычно так на Assembler'е пишут - 20 % кода и 80% комментариев.
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- /* Немножко подшаманим QLabel, чтобы он был больше,
- * и заметнее в пустующем окне
- * */
- QFont font("Times", 28, QFont::Bold);
- ui->label->setFont(font);
- /* При первом запуске приложения поместим текущее время в QLabel
- * */
- ui->label->setText(QTime::currentTime().toString("hh:mm:ss"));
- /* Инициализируем Таймер и подключим его к слоту,
- * который будет обрабатывать timeout() таймера
- * */
- timer = new QTimer();
- connect(timer, SIGNAL(timeout()), this, SLOT(slotTimerAlarm()));
- timer->start(1000); // И запустим таймер
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- /* Слот для обработки timeout() таймера
- * */
- void MainWindow::slotTimerAlarm()
- {
- /* Ежесекундно обновляем данные по текущему времени
- * Перезапускать таймер не требуется
- * */
- ui->label->setText(QTime::currentTime().toString("hh:mm:ss"));
- }
Итог
В результате при запуске обнаружим, как каждую секунду у Нас меняется время в окне приложения
Добрый день! Появилась проблемка. Есть клиент-серверное приложение. Нужно послать с сервера к клиентам сообщение через определенные промежутки времени. Реализовал это таким образом, что если у нас в QList лежит больше 1 сокета, то сначало посылается сообщение 1 клиенту, а потом включается таймер, но перед этим записывалось значение i в глобальную переменну(i взято из for). Использовал QTimer::singleshot(2000,this,Slot(slotZ()));. происходит вызов другой функции, где значение сокета берется из списка, по номеру как раз взятого из глобальной переменны, но почему то заместо того чтобы послать на 2 и 3 клиент через 2 сек сообщение, он посылает 2 сообщения на последний клиент.
Спасибо! Учту.
Вижу вы используете
new QTimer();
А кто будет память освобождать?
Почему вы вообще используете указатель QTimer *timer; а не объявите поле QTimer timer;?
Потому что 7 лет назад я был бестолковее, чем сейчас.
QTimer унаследован от QObject и ему передан this, идиома Qt предпологает что при вызове деструктора обьекта класса MyServer, обьект *timer тоже будет освобожден. Поправьте если ошибаюсь!
Да, именно так. Но в коде без this написано - это ошибка в статье.