Qt-де QTimer класын пайдалану туралы аздап сөйлесейік. Бұл QSqlTabelModel және оның салдары туралы ұзақ мақалалар сериясынан кейінгі шағын жеңіл тақырып. Ал содан кейін қазірдің өзінде өте сұр зат қайнайды.
Белгілі бір жиілікте TCP/IP стегі арқылы жергілікті желідегі құрылғыларды сұрау немесе деректерді немесе серверге белсенді қосылымдарды сағат сайын тексеру үшін бізге таймер қажет болуы мүмкін. Иә, кез келген нәрсе үшін!? Мұнда QTimer көмекке келеді, біз QLabel-те уақыттың әрбір екінші шығуының мысалын пайдалана отырып қарастырамыз.
Код Qt 5.4.1 негізінде QtCreator 3.3.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 написано - это ошибка в статье.