VS2022 + Qt 6.7.2 타이머 사용법 두 가지

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 방식으로 다른 에디트에 시간이 출력됩니다.

태그: Qt6 QTimer timerEvent QObject C++

7월 1일 00:29에 게시됨