Создание таймера обратного отсчета в Qt - PullRequest
1 голос
/ 14 февраля 2012

Итак, я нашел что-то здесь работающее, и я хочу понять, как это работает.

#ifndef  LCDNUMBER_H
#define LCDNUMBER_H

#include <QLCDNumber>
#include <QTimer>
#include <QTime>
#include <iostream>

class lcdDisplay : public QLCDNumber
{
    Q_OBJECT  

    public:
        // The QTimer class provides repetitive and single-shot timers.
        QTimer* objTimer;
        // The QTime class provides clock time functions.
        QTime*  objTime;

    public:
        lcdDisplay (QWidget *parentWidget, int minutes, int seconds)
        {
            objTimer = new QTimer ();
            // Setting our own time with the specified hours, minutes, and seconds.
            objTime  = new QTime  (0, minutes, seconds);

            setParent (parentWidget);

            // connect (objectA, signalAFromObjectA, objectB, slotAFromObjectB)
            // timeout (): This signal is emitted when the timer times out. The time out period can be specified with `start (int milliseconds)` function.
            QObject :: connect (objTimer, SIGNAL (timeout ()), this, SLOT (setDisplay ()));
        };

        ~ lcdDisplay () {};

    public slots:
        // This slot is called after the timer timeouts (1 second).
        void setDisplay ()
        {
            std::cout << "\nf,gfd,mgnfdm,gnf,\n";
            // 
            objTime->setHMS (0, objTime->addSecs (-1).minute (), objTime->addSecs (-1).second ());
            display (objTime->toString ());
        };
};
#endif

Я хочу понять эту строку: objTime->setHMS (0, objTime->addSecs (-1).minute (), objTime->addSecs (-1).second ());

Как это уменьшает минуты и секунды внутри?
Отсюда: http://doc.qt.nokia.com/4.7/qtime.html#addSecs

QTime n (14, 0, 0);// n == 14: 00: 00
QTime t;
t = n.addSecs (70);// t == 14: 01: 10
t = n.addSecs (-70);// t == 13:58:50

addSecs Функция возможно добавляет или вычитает секунды.Хорошо.но это делает objTime->addSecs (-1).minute (),?

Как работает setHMS?

Ответы [ 3 ]

3 голосов
/ 14 февраля 2012

Используйте класс QTimer , если вы хотите использовать функцию таймера обратного отсчета.

1 голос
/ 14 февраля 2012

objTime->addSecs(-1) не изменяет objTime, но возвращает новый объект QTime, который на одну секунду меньше, чем objTime.Затем .minute() возвращает минутную часть нового объекта QTime, а .second() возвращает вторую часть нового объекта QTime.

Код может быть более эффективным, если он предварительно рассчитывает новое время только один раз.

Также строку можно переписать в виде (но новый код ниже учитывает также часы):

*objTime = objTime->addSecs(-1); // Thanks André Caron for the correction

без использования setHMS()

1 голос
/ 14 февраля 2012

Этот пример кода сам по себе не имеет функции для обратного отсчета, как секундомер.В настоящее время это пример отображения только для отображения текущего значения времени.Если вы хотите разрешить обратный отсчет, я бы порекомендовал добавить QTimer в класс с тайм-аутом в 1 секунду.Вы подключаете тайм-аут к слоту, который будет вычитать одну секунду из вашего времени отображения.Когда вы запускаете внутренний таймер, он срабатывает каждую секунду.В вашем слоте, который выполняет вычитание, вы можете остановить таймер, как только ваше значение часов достигнет нуля.

update

Ваш новый отредактированный пример - именно то, что я описывал здесь с этим первоначальным ответом.Таймер срабатывает каждую секунду и вызывает слот, который регулирует объект времени

...