[Qt] QTimer

이번 글에서는 QTimer에 대해 알아보겠습니다.

QTimer는 일정 시간 간격마다 특정 작업을 실행하거나, 일정 시간 뒤에 특정 작업을 실행하는데 사용되는 클래스 입니다.

QTimer를 사용하기 위해서는 QTimer 헤더 파일을 include 해야합니다.

#include <QTimer>

아래 함수는 QTimer에서 대표적으로 사용되는 함수 입니다.

  • start: 타이머 시작
  • stop: 타이머 정지
  • singleShot: 일정 시간이 지난 뒤 수행

QTimer를 이용해서 1초마다 시간을 표시하는 위젯을 만들어 보겠습니다.

아래와 같이 라벨 두 개와 버튼 세 개를 만들어 보겠습니다.

그 다음 widget.h에 아래 와 같이 QTimer 멤버 변수, QTimer에 대한 slot 함수, 버튼 클릭 slot 함수를 생성해보겠습니다.

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QTimer *m_timer; // QTimer 변수 생성

public slots:
    void slot_startClicked(); // 시작 버튼
    void slot_stopClicked(); // 정지 버튼
    void slot_singleShotClicked(); // single shot 버튼

    void slot_timeout(); // 일정 시간 간격으로 실행하는 slot 함수
    void slot_singleShot(); // 일정 시간 뒤 실행하는 slot 함수
};
#endif // WIDGET_H

widget.cpp에 아래와 같이 코딩해줍니다.

#include "widget.h"
#include "ui_widget.h"

#include <QDateTime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 버튼 활성화/비활성화
    ui->pbtStart->setEnabled(true);
    ui->pbtStop->setEnabled(false);

    // start, stop, singleShot 버튼 connect
    connect(ui->pbtStart, &QPushButton::clicked, this, &Widget::slot_startClicked);
    connect(ui->pbtStop, &QPushButton::clicked, this, &Widget::slot_stopClicked);
    connect(ui->pbtSingleShot, &QPushButton::clicked, this, &Widget::slot_singleShotClicked);

    // 타이머
    m_timer = new QTimer();
    connect(m_timer, &QTimer::timeout, this, &Widget::slot_timeout); // start 함수 호출 시 slot_timeout 함수 호출
}

Widget::~Widget()
{
    delete ui;
}

void Widget::slot_startClicked()
{
    ui->pbtStart->setEnabled(false);
    ui->pbtStop->setEnabled(true);
    m_timer->start(1000); // 타이머 1초 간격마다 실행
}

void Widget::slot_stopClicked()
{
    ui->pbtStart->setEnabled(true);
    ui->pbtStop->setEnabled(false);
    m_timer->stop(); // 타이머 종료
}

void Widget::slot_singleShotClicked()
{
    QDateTime current = QDateTime::currentDateTime();
    QString timeStr;
    timeStr = current.toString("3초 뒤 표시(현재 yyyy-MM-dd hh:mm:ss zzz)");
    ui->lbSingleShot->setText(timeStr);

    QTimer::singleShot(3000, this, &Widget::slot_singleShot); // 3초 후에 slot_singleShot 함수 호출
}

void Widget::slot_timeout()
{
    QDateTime current = QDateTime::currentDateTime();
    QString timeStr;
    timeStr = current.toString("현재 yyyy-MM-dd hh:mm:ss zzz");
    ui->lbTime->setText(timeStr);
}

void Widget::slot_singleShot()
{
    QDateTime current = QDateTime::currentDateTime();
    QString timeStr;
    timeStr = current.toString("현재 yyyy-MM-dd hh:mm:ss zzz");
    ui->lbSingleShot->setText(timeStr);
}

실행 하면 아래와 같이 동작합니다.

전체 코드는 아래 github 링크를 참고하시면 됩니다.

https://github.com/3001ssw/qt_cpp_study/tree/main/019QTimer02

QTimer는 사용법이 간단합니다. 이상으로 QTimer에 대해 알아보았습니다.