Класс QTimer


Использование объекта класса QTimer гораздо проще, чем использование события таймера, определенного в классе QObject. К недостаткам работы с событием таймера относится необходимость наследования одного из классов наследующих QObject. Затем, в унаследованном классе нужно реализовать метод, принимающий объекты события таймера. А если в объекте создается более одного таймера, то возникает необходимость различать таймеры, чтобы узнать, который из них явился инициатором события.

Для ликвидации этих неудобств Qt предоставляет класс таймера QTimer, являющийся непосредственным наследником класса QObject. Чтобы запустить таймер, нужно создать объект класса QTimer, а затем вызвать метод start().

В параметре метода передается значение интервала запуска в миллисекундах.

Класс QTimer содержит статический метод singleshot() для одноразового режима отработки таймера (singleshot). С его помощью можно запустить одноразовый таймер без создания объекта класса QTimer. Первый параметр метода задает интервал запуска, а второй — является указателем на объект, с которым должно осуществляться соединение. Слот для соединения передается в третьем параметре. Этим можно воспользоваться, например, для прекращения работы демо-версии программы через 5 минут после ее запуска.


int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    MyProgram myProgram;
    QTimer::singleShot(5 * 60 * 1000, &app, SLOT(quit()));
    myProgram.show();
    return app.exec();
}

По истечении интервала запуска таймера высылается сигнал timeout(), который нужно соединить со слотом, выполняющим нужные действия. При помощи метода setInterval() можно изменить интервал запуска таймера. В том случае, если таймер был активен, он будет остановлен и запущен с новым интервалом, и ему будет присвоен новый идентификационный номер.

При помощи метода isActive() можно проверить, находится таймер в активном состоянии. Вызовом метода stop() можно остановить таймер.

Программа, окно которой изображено на рисунке, реализует часы, отображающие дату и время. Отображаемая информация актуализируется в соответствии с установленным полусекундным интервалом запуска таймера.

{рисунок}


#include <QtGui>

class Clock : public QLabel {
    Q_OBJECT

public:
    Clock(QWidget* pwgt = 0) : QLabel(pwgt)
    {
        QTimer* ptimer = new QTimer(this);
        connect(ptimer, SIGNAL(timeout()), SLOT(slotUpdateDateTime()));
        ptimer->start(500);
        slotUpdateDateTime();
    }

public slots:
    void slotUpdateDateTime()
    {
        QString str = 
            QDateTime::currentDateTime().toString(Qt::SystemLocaleDate);
        setText("<H2><CENTER>" + str + "</CENTER></H2>");
    }
};
#endif  //_Clock_h_

В конструкторе класса Clock создается объект таймера (указатель ptimer). Его сигнал timeout() соединяется со слотом, ответственным за обновление Отображаемой информации slotUpdateDateTime(). Вызов метода start() запускает таймер. В него передается интервал запуска. Слот slotUpdateDateTime() получает актуальную дату и время с помощью метода currentDateTime(). Затем он, с параметром локализации Qt::SystemLocaleDate преобразовывает дату и время к строковому типу и передает, для отображения, в метод setText().

В качестве альтернативы, в Qt предусмотрено минималистическое решение для таймера — это класс QBasicTimer, пред оставляющий только четыре метода:

  • isActive(),
  • start(),
  • stop(),
  • timerId().

Данные методы по своей функциональности, аналогичны методам класса QTimer. Исключение составляет только метод start(). Помимо первого параметра, задающего интервал, в этот метод, вторым параметром, передается указатель на объект QObject, который будет получать события таймера. То есть, вам нужно будет реализовать в классе, унаследованном от QObject, метод обработки события таймера QObject::timerEvent().

Читать далее: Процессы и потоки в Qt