1. QObject 타이머 이벤트 활용
QObject를 상속받는 모든 클래스는 timerEvent(QTimerEvent *event) 가상 함수를 제공합니다. startTimer()로 간격과 타이머를 시작하고, 이 함수를 재정의하여 작업을 처리합니다. 여러 타이머는 ID로 구분하며, killTimer()로 종료합니다.
// 헤더에서 선언
protected:
void timerEvent(QTimerEvent *event) override;
int m_timerId;
// 구현부
void MyWindow::timerEvent(QTimerEvent* event)
{
if (event->timerId() == m_timerId)
{
qDebug() << "QObject 타이머 실행됨";
}
}
// 타이머 시작
m_timerId = startTimer(1000); // 1초 간격
2. QTimer 클래스 사용
시그널-슬롯 메커니즘을 활용합니다. QTimer 객체를 생성하고 timeout 시그널을 슬롯에 연결한 후, start() 함수로 타이머를 구동합니다.
// 헤더
#include <QTimer>
QTimer *m_pTimer;
public slots:
void onTimeout();
// 구현부 (생성자 등에서)
m_pTimer = new QTimer(this);
connect(m_pTimer, &QTimer::timeout, this, &MyWindow::onTimeout);
m_pTimer->start(1000); // 1초 간격
void MyWindow::onTimeout()
{
qDebug() << "QTimer 시그널 발생!";
}
3. UI를 포함한 전체 예제
VS2022 + Qt 6.7.2 환경에서 두 방법을 하나의 창에 구현한 코드입니다.
Widgets.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_Widgets.h"
#include <QTimer>
#include <QDateTime>
#include <QDebug>
class Widgets : public QMainWindow
{
Q_OBJECT
public:
Widgets(QWidget *parent = nullptr);
~Widgets();
QTimer *m_pTimer;
void startTimerSlot();
protected:
void timerEvent(QTimerEvent *event) override;
int m_nTimerId;
private:
Ui::WidgetsClass ui;
};
Widgets.cpp
#include "Widgets.h"
Widgets::Widgets(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_pTimer = new QTimer(this);
connect(m_pTimer, &QTimer::timeout, this, &Widgets::startTimerSlot);
connect(ui.pushButtonStart, &QPushButton::clicked, [=]() {
m_pTimer->start(1000);
});
connect(ui.pushButtonStart2, &QPushButton::clicked, this, [=]() {
m_nTimerId = startTimer(1000);
});
}
void Widgets::startTimerSlot()
{
QDateTime currentTime = QDateTime::currentDateTime();
ui.textEdit->append(currentTime.toString("hh:mm:ss.zzz"));
}
void Widgets::timerEvent(QTimerEvent* event)
{
if (event->timerId() == m_nTimerId)
{
QDateTime currentTime = QDateTime::currentDateTime();
ui.textEdit_2->append(currentTime.toString("yyyy-MM-dd hh:mm:ss"));
}
}
Widgets::~Widgets()
{
if (m_pTimer->isActive())
m_pTimer->stop();
}
main.cpp
#include "Widgets.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Widgets w;
w.show();
return app.exec();
}
핵심 포인트
- 방법 1 (QObject): 가상 함수 재정의, 여러 타이머는 ID로 관리,
killTimer()로 제거 - 방법 2 (QTimer): 시그널-슬롯 기반, 객체 소멸 시 자동 정리 가능,
setSingleShot(true)로 1회 실행 가능 - 두 방법 모두 밀리초 단위로 간격 지정 가능
실행 결과: 첫 번째 버튼을 누르면 QTimer 방식으로 텍스트 에디트에 시간이 추가되고, 두 번째 버튼을 누르면 QObject 방식으로 다른 에디트에 시간이 출력됩니다.