이번 글에서는 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에 대해 알아보았습니다.