Lassen Sie uns ein wenig über die Verwendung der QTimer-Klasse in Qt sprechen. Dies ist ein kleines, leichtes Thema nach einer Reihe langer Artikel über QSqlTabelModel und seine Konsequenzen. Und dann kocht schon die ganz graue Substanz.
Möglicherweise benötigen wir Timer, um Geräte in regelmäßigen Abständen über ein LAN über den TCP / IP-Stack abzufragen oder um stündlich Daten oder aktive Verbindungen zum Server zu überprüfen. Für alles !? Und hier hilft QTimer, den wir am Beispiel jeder zweiten Ausgabe von Zeit in QLabel betrachten.
Der Programmcode wurde in QtCreator 3.3.1 basierend auf Qt 5.4.1 geschrieben.
Projektstruktur für QTimer
Wir verwenden ein Minimum an Dateien in unserem Projekt:
- QDataMapperWidget.pro - Profil;
- mainwindow.h - Header-Datei des Hauptanwendungsfensters;
- mainwindow.cpp - Fensterquellcode;
- main.cpp - die Hauptquelldatei, von der aus die Anwendung startet;
- mainwindow.ui - Form des Hauptanwendungsfensters;
- Und wir werden die Form im QtCreator Designer zeichnen. Es gibt jedoch nichts zu zeichnen. Das QLabel in die Mitte werfen und fertig.
mainwindow.h
Alles, was wir in diesem Projekt brauchen, um glücklich zu sein, ist ein Slot, der auf das Auslösen des QTimer reagiert, und das Objekt dieser Klasse selbst.
#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
Und jetzt noch ein paar Zeilen um den Timer zu starten. Meiner Meinung nach gibt es mehr Kommentare als Code. Normalerweise schreiben sie so auf Assembler - 20 % des Codes und 80 % der Kommentare.
#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")); }
Ergebnis
Als Ergebnis werden wir beim Start feststellen, wie sich die Zeit im Anwendungsfenster jede Sekunde ändert.
Добрый день! Появилась проблемка. Есть клиент-серверное приложение. Нужно послать с сервера к клиентам сообщение через определенные промежутки времени. Реализовал это таким образом, что если у нас в 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 написано - это ошибка в статье.