QTimer также может использоваться для запроса функции для запуска, как только цикл события обрабатывает все остальные ожидающие события события. Для этого используйте интервал 0 мс.
0707 ангельское числ�.
Please enable JavaScript
// option 1: Set the interval to 0 explicitly. QTimer *timer = new QTimer; timer->setInterval( 0 ); timer->start(); // option 2: Passing 0 with the start call will set the interval as well. QTimer *timer = new QTimer; timer->start( 0 ); // option 3: use QTimer::singleShot with interval 0 QTimer::singleShot(0, []()< // do something >);
Простой пример
В следующем примере показано, как использовать QTimer для вызова слота каждые 1 секунду.
В этом примере мы используем QProgressBar для обновления его значения и проверки правильности работы таймера.
main.cpp
#include #include «timer.h» int main(int argc, char *argv[])
timer.h
#ifndef TIMER_H #define TIMER_H #include class QProgressBar; class Timer : public QWidget < Q_OBJECT public: Timer(QWidget *parent = 0); public slots: void updateProgress(); private: QProgressBar *progressBar; >; #endif
timer.cpp
Создание программы Таймер | Программирование на Delphi
#include #include #include #include «timer.h» Timer::Timer(QWidget *parent) : QWidget(parent) < QHBoxLayout *layout = new QHBoxLayout(); progressBar = new QProgressBar(); progressBar->setMinimum(0); progressBar->setMaximum(100); layout->addWidget(progressBar); setLayout(layout); QTimer *timer = new QTimer(this); connect(timer, Timer::updateProgress); timer->start(1000); setWindowTitle(tr(«Timer»)); resize(200, 200); > void Timer::updateProgress() < progressBar->setValue(progressBar->value()+1); >
timer.pro
QT += widgets HEADERS = timer.h SOURCES = main.cpp timer.cpp
Таймер Singleshot с функцией Lambda как слот
Если требуется одиночный таймер, удобно использовать слот в виде лямбда-функции прямо там, где объявлен таймер:
QTimer::singleShot(1000, []() < /*Code here*/ >);
Из-за этого Bug (QTBUG-26406) , этот способ возможен только с Qt5.4.
В более ранних версиях Qt5 это должно быть сделано с большим количеством кодовых табличек:
QTimer *timer = new QTimer(this); timer->setSingleShot(true); connect(timer, /*Code here*/ timer->deleteLater(); > );
Использование QTimer для запуска кода в основном потоке
void DispatchToMainThread(std::function callback) < // any thread QTimer* timer = new QTimer(); timer->moveToThread(qApp->thread()); timer->setSingleShot(true); QObject::connect(timer, // main thread callback(); timer->deleteLater(); >); QMetaObject::invokeMethod(timer, «start», Qt::QueuedConnection, Q_ARG(int, 0)); >
Это полезно, когда вам нужно обновить элемент пользовательского интерфейса из потока. Имейте в виду всю жизнь, на которую ссылаются обратные вызовы.
DispatchToMainThread([] < // main thread // do UI work here >);
Тот же код может быть адаптирован для запуска кода в любом потоке, который запускает цикл событий Qt, тем самым реализуя простой механизм отправки.
Python. Таймер с обратным отсчетом
Основное использование
QTimer добавляет функциональность, чтобы иметь определенную функцию / слот, вызываемый через определенный интервал (несколько раз или только один раз).
Таким образом, QTimer позволяет графическому интерфейсу регулярно проверять вещи или обрабатывать тайм-ауты без необходимости вручную запускать лишний поток для этого и следить за условиями гонки, поскольку таймер будет обрабатываться в цикле основного события.
Таймер можно просто использовать следующим образом:
QTimer* timer = new QTimer(parent); //create timer with optional parent object connect(timer, checkProgress(); >); //some function to check something timer->start(1000); //start with a 1s interval
Таймер запускает сигнал timeout когда время завершено, и это будет вызываться в цикле основного события.
QTimer :: однократное простое использование
QTimer :: singleShot используется для асинхронного вызова слота / лямбда после n ms.
QTimer::singleShot(myTime, myObject, SLOT(myMethodInMyObject()));
с myTime время в ms, myObject объект, который содержит метод и myMethodInMyObject, слот для вызова
Так, например, если вы хотите иметь таймера, который пишет строку отладки «привет!» каждые 5 секунд:
void MyObject::startHelloWave() < QTimer::singleShot(5 * 1000, this, SLOT(helloWave())); >void MyObject::helloWave()
class MyObject : public QObject < Q_OBJECT . void startHelloWave(); private slots: void helloWave(); . >;
Источник: learntutorials.net
QTimer: Примеры использования
Таймеры в Qt (и не только) позволяют выполнять некий код по заданным временным интервалам. Для таймеров существует два наиболее очевидных варианта использования. Рассмотрим соответствующие примеры.
Таймер для периодического выполнения действий
В первом случае таймер выступает в качестве альтернативы потокам. Преимуществом таймеров по сравнению с потоками является простота использования. Однако имеется и недостаток: код, вызываемый по таймеру, выполняется в главном потоке, что может привести к «подвисаниям» графического интерфейса пользователя.
Создадим виджет, который каждую секунду меняет цвет своего фона. Заголовочный файл timerdemowidget.h :
#ifndef TIMERDEMOWIDGET_H #define TIMERDEMOWIDGET_H #include #include class TimerDemoWidget : public QWidget < Q_OBJECT public: TimerDemoWidget( QWidget* parent = 0 ); ~TimerDemoWidget(); private slots: void setRandomBackgroundColor(); private: QTimer m_timer; >; #endif // TIMERDEMOWIDGET_H
#include «timerdemowidget.h» TimerDemoWidget::TimerDemoWidget( QWidget* parent ) : QWidget( parent ) < connect( m_timer.start( 1000 ); // Таймер будет срабатывать каждые 1000 миллисекунд, т.е. каждую секунду >TimerDemoWidget::~TimerDemoWidget() < >void TimerDemoWidget::setRandomBackgroundColor() < QPalette palette( this->palette() ); int r = qrand() % 256; int g = qrand() % 256; int b = qrand() % 256; palette.setColor( QPalette::Background, QColor( r, g, b ) ); setPalette( palette ); >
Таймер запускается с помощью QTimer::start() . Остановить таймер можно вызовом QTimer::stop() .
Для изменения цвета фона виджета используется объект палитры QPalette . Сам цвет QColor формируется из трех компонент r, g, b , выбранных случайным образом.
Осталось отобразить виджет:
#include #include «timerdemowidget.h» int main( int argc, char* argv[] )
Похожий прием хорошо подходит для создания простых эффектов и анимации (например, мигающего текста или исчезающих кнопок).
Также этот вариант использования таймеров оказывается незаменимым в случае применения потоков из сторонних библиотек. В Qt сигнально-слотовая связь является потоково-безопасной, поэтому очередь передачи сообщений из рабочих потоков в главный уже имеется. Ситуация меняется, когда появляется поток, не генерирующий сигналов. В этом случае требуется вручную организовать такую очередь. Чтобы время от времени отслеживать состояние очереди и обновлять графический интерфейс пользователя, таймер и нужен.
Таймер для отложенного выполнения действия
QTimer хорошо подходит и в тех случаях, когда требуется выполнить действие всего один раз, но не сразу, а через некий временной интервал. Для этого предусмотрена функция-член QTimer::singleShot() .
В следующем примере приводится код приложения, которое само завершается через 5 секунд после старта:
#include #include int main( int argc, char* argv[] )
Аналогично можно реализовать любую функцию для выполнения отложенных действий. Например, можно создать исчезающую через некоторое время подсказку или организовать «спящий режим» для приложения в случае долгого отсутствия действий со стороны пользователя.
Источник: itnotesblog.ru
Qt/C++ — Урок 009. QTimer или Как работать с таймером в Qt?
Немного поговорим о применении класса 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 #include #include #include 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»)); >
Итог
В результате при запуске обнаружим, как каждую секунду у Нас меняется время в окне приложения
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Рекомендуемые статьи по этой тематике
- PyQt5 — Урок 007. Работаем с QML QtQuick (Сигналы и слоты)
- QML — Урок 004. Сигналы и слоты в Qt QML
- Qt/C++ — Урок 024. Сигналы и слоты в Qt5
- Qt/C++ — Урок 012. QShortcut или Горячие клавиши в Qt
По статье задано1 вопрос(ов)
Подписка на обсуждение 7
Подписка на раздел 336
Вам это нравится? Поделитесь в социальных сетях!
Источник: evileg.com