이 페이지에서

QTimer Class

QTimer 클래스는 반복 타이머와 일회성 타이머 기능을 제공합니다. 더 보기...

헤더: #include <QTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
상속: QObject

속성

공개 함수

QTimer(QObject *parent = nullptr)
virtual ~QTimer()
QBindable<bool> bindableActive()
QBindable<int> bindableInterval()
QBindable<bool> bindableSingleShot()
QBindable<Qt::TimerType> bindableTimerType()
QMetaObject::Connection callOnTimeout(Functor &&slot)
QMetaObject::Connection callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
(since 6.8) Qt::TimerId id() const
int interval() const
std::chrono::milliseconds intervalAsDuration() const
bool isActive() const
bool isSingleShot() const
int remainingTime() const
std::chrono::milliseconds remainingTimeAsDuration() const
void setInterval(int msec)
void setInterval(std::chrono::milliseconds value)
void setSingleShot(bool singleShot)
void setTimerType(Qt::TimerType atype)
void start(std::chrono::milliseconds interval)
int timerId() const
Qt::TimerType timerType() const

공개 슬롯

void start(int msec)
void start()
void stop()

신호

void timeout()

정적 공용 멤버

void singleShot(Duration interval, Functor &&functor)
void singleShot(Duration interval, Qt::TimerType timerType, Functor &&functor)
void singleShot(Duration interval, const QObject *context, Functor &&functor)
void singleShot(Duration interval, Qt::TimerType timerType, const QObject *context, Functor &&functor)
void singleShot(std::chrono::nanoseconds nsec, const QObject *receiver, const char *member)
void singleShot(std::chrono::nanoseconds nsec, Qt::TimerType timerType, const QObject *receiver, const char *member)

재구현된 보호 함수

virtual void timerEvent(QTimerEvent *e) override

상세 설명

QTimer 클래스는 타이머를 위한 고수준 프로그래밍 인터페이스를 제공합니다. 이를 사용하려면 QTimer 객체를 생성하고, 해당 객체의 ` timeout()` 신호를 적절한 슬롯에 연결한 다음, ` start()`를 호출하면 됩니다. 그 이후부터는 일정한 간격으로 ` timeout()` 신호를 발산합니다.

1초(1000밀리초) 타이머 예제 ( Analog Clock 예제에서 발췌):

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
    timer->start(1000);

그 후로는 1초마다 update() 슬롯이 호출됩니다.

setSingleShot(true)를 호출하여 타이머가 한 번만 작동하도록 설정할 수 있습니다. 또한 정적 함수 QTimer::singleShot()을 사용하여 지정된 간격 후에 슬롯을 호출할 수도 있습니다:

    QTimer::singleShot(200, this, &Foo::updateCaption);

멀티스레드 애플리케이션에서는 이벤트 루프가 있는 모든 스레드에서 QTimer를 사용할 수 있습니다. GUI가 아닌 스레드에서 이벤트 루프를 시작하려면 QThread::exec()을 사용하십시오. Qt는 타이머의 ` thread affinity `를 사용하여 ` timeout()` 신호를 발송할 스레드를 결정합니다. 이 때문에 타이머는 해당 스레드 내에서 시작하고 중지해야 하며, 다른 스레드에서 타이머를 시작하는 것은 불가능합니다.

특별한 경우로, 타임아웃이 0인 QTimer는 가능한 한 빨리 타임아웃이 발생하지만, 0 타임아웃 타이머와 다른 이벤트 소스 간의 처리 순서는 명시되지 않습니다. 0 타임아웃 타이머를 사용하면 사용자 인터페이스의 반응성을 유지하면서 일부 작업을 수행할 수 있습니다:

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Foo::processOneThing);
    timer->start();

그 시점부터 ` processOneThing() `가 반복적으로 호출됩니다. 이 함수는 항상 빠르게 반환되도록(일반적으로 데이터 항목 하나를 처리한 후) 작성되어야 하며, 이를 통해 Qt는 모든 작업이 완료되는 즉시 사용자 인터페이스에 이벤트를 전달하고 타이머를 중지할 수 있습니다. 이는 GUI 애플리케이션에서 부하가 큰 작업을 구현하는 전통적인 방식이지만, 요즘 들어 점점 더 많은 플랫폼에서 멀티스레딩을 지원함에 따라, 제로 밀리초 QTimer 객체는 점차 QThread로 대체될 것으로 예상됩니다.

정확도와 타이머 분해능

타이머의 정확도는 기본이 되는 운영 체제와 하드웨어에 따라 달라집니다. 대부분의 플랫폼은 1밀리초의 분해능을 지원하지만, 실제 상황에서는 타이머의 정확도가 이 분해능과 일치하지 않는 경우가 많습니다.

정확도는 또한 timer type 에 따라 달라집니다. Qt::PreciseTimer 의 경우, QTimer는 정확도를 1밀리초로 유지하려고 시도합니다. 또한 정밀 타이머는 예상보다 일찍 타임아웃되지 않습니다.

Qt::CoarseTimer 및 Qt::VeryCoarseTimer 유형의 경우, QTimer는 해당 유형의 허용 오차 범위 내에서 예상보다 일찍 깨어날 수 있습니다. Qt::CoarseTimer 의 경우 간격의 5%, Qt::VeryCoarseTimer 의 경우 500 ms가 허용 오차 범위입니다.

시스템이 바쁘거나 요청된 정확도를 제공할 수 없는 경우, 모든 타이머 유형은 예상보다 늦게 타임아웃될 수 있습니다. 이러한 타임아웃 초과 상황에서는, 여러 타임아웃이 만료되었더라도 Qt는 timeout()를 단 한 번만 발생시킨 후 원래의 간격으로 다시 진행합니다.

QTimer의 대안

Qt 6.8에서는 QChronoTimer 가 도입되었습니다. 두 클래스의 주요 차이점은 QChronoTimer 가 더 넓은 간격 범위와 더 높은 정밀도를 지원한다는 점입니다(std::chrono::nanoseconds). QTimer의 경우 지원되는 최대 간격은 ±24일인 반면, QChronoTimer 의 경우 ±292년입니다( std::numeric_limits<int>::max() 보다 긴 간격에서 정수 오버플로우가 발생할 가능성이 적습니다). 밀리초 단위의 해상도와 ±24일의 범위만 필요한 경우, QTimer를 계속 사용할 수 있습니다.

또 다른 대안은 클래스 내에서 ` QObject::timerEvent()` 메서드를 재구현하고(해당 클래스는 ` QObject`의 서브클래스여야 함), 다음 방법 중 하나를 사용하는 것입니다:

  • QBasicTimer 를 사용하는 방법입니다. 이는 타이머 ID를 감싸는 경량 값 클래스입니다. QBasicTimer::start()으로 타이머를 시작하고, QBasicTimer::stop()으로 중지할 수 있습니다. 재구현한 timerEvent()에서 이벤트를 처리할 수 있습니다.
  • 보다 저수준의 방법은 타이머 ID를 직접 조작하는 것입니다. 타이머를 시작하려면 QObject::startTimer()를 호출하고 반환된 ID를 저장하십시오. 타이머를 중지하려면 QObject::killTimer()를 호출하십시오. 재구현한 timerEvent()에서 이벤트를 처리할 수 있습니다. 이 방법은 일반적으로 QBasicTimer 를 사용하는 것보다 더 번거롭습니다.

timerEvent()을 사용할 때의 단점은 단일 실행 타이머나 시그널과 같은 일부 고급 기능이 지원되지 않는다는 점입니다.

일부 운영 체제에서는 사용할 수 있는 타이머의 수를 제한하며, Qt는 이러한 제한을 우회하려고 시도합니다.

QBasicTimer, QTimerEvent, QObject::timerEvent(), 타이머 및 아날로그 시계항목도 참조하십시오 .

속성 문서

[bindable read-only] active : bool

참고: 이 속성은 QProperty 바인딩을 지원합니다.

이 부울 속성은 타이머가 실행 중일 경우 ` true `을 반환하고, 그렇지 않은 경우 `false`를 반환합니다.

액세스 함수:

bool isActive() const

[bindable] interval : int

참고: 이 속성은 QProperty 바인딩을 지원합니다.

이 속성은 타임아웃 간격을 밀리초 단위로 저장합니다.

이 속성의 기본값은 0입니다. 타임아웃 간격이 0인 QTimer 는 윈도우 시스템의 이벤트 큐에 있는 모든 이벤트가 처리되는 즉시 타임아웃됩니다.

참고: 타이머 값을 0으로 설정하여 이벤트 루프를 계속 바쁘게유지하면 문제가 발생하고 UI가 매우 불안정해질 수 있습니다.

실행 중인 타이머의 간격을 설정하면 간격이 변경되고, stop()를 호출한 다음 start()를 호출하여 타이머를 초기화하며, 새로운 id()를 반환합니다. 타이머가 실행 중이 아닌 경우, 간격만 변경됩니다.

Qt 6.10부터는 음수의 간격을 설정하면 런타임 경고가 발생하고 값이 1ms로 재설정됩니다. Qt 6.10 이전 버전에서는 Qt Timer에서 음수 간격을 설정할 수 있었지만, 예상치 못한 방식으로 동작했습니다(예: 타이머가 실행 중일 경우 중지되거나 아예 시작되지 않는 경우 등).

액세스 함수:

int interval() const
void setInterval(int msec)
void setInterval(std::chrono::milliseconds value)

singleShot도 참조하십시오 .

[read-only] remainingTime : int

이 속성은 남은 시간을 밀리초 단위로 저장합니다.

타임아웃까지 남은 시간을 밀리초 단위로 반환합니다. 타이머가 비활성화된 경우 반환 값은 -1이 됩니다. 타이머가 이미 만료된 경우 반환 값은 0이 됩니다.

액세스 함수:

int remainingTime() const

interval도 참조하십시오 .

[bindable] singleShot : bool

참고: 이 속성은 QProperty 바인딩을 지원합니다.

이 속성은 타이머가 단일 실행 타이머인지 여부를 나타냅니다.

단일 발동 타이머는 한 번만 작동하는 반면, 단일 발동 타이머가 아닌 타이머는 interval 밀리초마다 작동합니다.

이 속성의 기본값은 false 입니다.

액세스 함수:

bool isSingleShot() const
void setSingleShot(bool singleShot)

interval 및 singleShot()도 참조하십시오 .

[bindable] timerType : Qt::TimerType

참고: 이 속성은 QProperty 바인딩을 지원합니다.

타이머의 정확도를 제어합니다.

이 속성의 기본값은 Qt::CoarseTimer 입니다.

액세스 함수:

Qt::TimerType timerType() const
void setTimerType(Qt::TimerType atype)

Qt::TimerType도 참조하십시오 .

멤버 함수 설명서

[explicit] QTimer::QTimer(QObject *parent = nullptr)

지정된 ` parent`를 사용하여 타이머를 생성합니다.

[virtual noexcept] QTimer::~QTimer()

타이머를 제거합니다.

template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor &&slot)

타이머의 ` timeout()` 신호와 ` slot` 간에 연결을 생성합니다. 연결에 대한 핸들을 반환합니다.

이 메서드는 편의상 제공됩니다. 다음 호출과 동일합니다:

QObject::connect(timer, &QTimer::timeout, timer, slot, Qt::DirectConnection);

참고: QT_NO_CONTEXTLESS_CONNECT 가 정의된 경우이 오버로드는 사용할 수 없으며, 대신 컨텍스트 객체를 인수로 받는 callOnTimeout() 오버로드를 사용하십시오.

QObject::connect() 및 timeout()도 참조하십시오 .

template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)

timeout() 신호에서 slot 으로 연결을 생성하여 context 의 특정 이벤트 루프에 배치하고, 해당 연결에 대한 핸들을 반환합니다.

이 메서드는 편의상 제공됩니다. 다음 호출과 동일합니다:

QObject::connect(timer, &QTimer::timeout, context, slot, connectionType);

이 함수는 QTimer::callOnTimeout()을 오버로드합니다.

QObject::connect() 및 timeout()도 참조하십시오 .

[since 6.8] Qt::TimerId QTimer::id() const

타이머가 실행 중일 경우 타이머 ID를 나타내는 ` Qt::TimerId `를 반환하고, 그렇지 않은 경우 ` Qt::TimerId::Invalid`를 반환합니다.

이 함수는 Qt 6.8에서 도입되었습니다.

Qt::TimerId도 참조하십시오 .

std::chrono::milliseconds QTimer::intervalAsDuration() const

이 타이머의 간격을 ` std::chrono::milliseconds ` 객체로 반환합니다.

interval도 참조하십시오 .

bool QTimer::isActive() const

타이머가 실행 중이면 ` true `를 반환하고, 그렇지 않으면 ` false`를 반환합니다.

참고: active 속성에 대한게터 함수입니다.

std::chrono::milliseconds QTimer::remainingTimeAsDuration() const

이 타이머 객체의 남은 시간을 ` std::chrono::milliseconds ` 객체로 반환합니다. 이 타이머가 만료되었거나 만료 시간이 지난 경우, 반환 값은 ` std::chrono::milliseconds::zero()`입니다. 남은 시간을 찾을 수 없거나 타이머가 실행 중이 아닌 경우, 이 함수는 음수의 지속 시간을 반환합니다.

remainingTime()도 참조하십시오 .

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, Functor &&functor)

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, Qt::TimerType timerType, Functor &&functor)

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, const QObject *context, Functor &&functor)

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, Qt::TimerType timerType, const QObject *context, Functor &&functor)

이 정적 함수는 ` interval` 실행 후 ` functor `을 호출합니다.

이 함수를 사용하면 ` timerEvent `을 직접 처리하거나 ` QTimer ` 객체를 로컬로 생성할 필요가 없으므로 매우 편리합니다.

context 가 지정된 경우, functor 는 context 객체가 인터벌이 발생하기 전에 소멸되지 않은 경우에만 호출됩니다. 그러면 펑크터는 context 의 스레드에서 실행됩니다. 컨텍스트의 스레드에는 실행 중인 Qt 이벤트 루프가 있어야 합니다.

functor 가 context 의 멤버 함수인 경우, 해당 함수는 객체에서 호출됩니다.

interval 매개변수는 int (밀리초 수로 해석됨)이거나, 암시적으로 나노초로 변환되는 std::chrono 유형일 수 있습니다.

Qt 6.10부터는 음수의 간격을 설정하면 런타임 경고가 발생하고 값이 1ms로 재설정됩니다. Qt 6.10 이전 버전에서는 Qt Timer에서 음수 간격을 설정할 수 있었지만, 예상치 못한 방식으로 동작했습니다(예를 들어, 타이머가 실행 중이면 중지되거나 아예 시작되지 않는 경우 등).

참고: Qt 6.8 이전버전에서는 chrono 오버로드가 chrono::nanoseconds가 아닌 chrono::milliseconds를 사용했습니다. 컴파일러가 자동으로 변환해 주지만, 밀리초 수치가 매우 클 경우 변환 과정에서 오버플로우가 발생할 수 있습니다.

참고: 이 함수는 재진입 가능합니다.

start()도 참조하십시오 .

[static] void QTimer::singleShot(std::chrono::nanoseconds nsec, const QObject *receiver, const char *member)

이 정적 함수는 지정된 시간 간격이 지난 후 슬롯을 호출합니다.

이 함수를 사용하면 ` timerEvent `을 신경 쓸 필요도 없고, ` QTimer ` 객체를 로컬로 생성할 필요도 없기 때문에 매우 편리합니다.

receiver 는 수신 객체이며, member 는 슬롯입니다. 시간 간격은 지속 시간 객체 nsec 로 지정됩니다.

Qt 6.10부터는 음수의 간격을 설정하면 런타임 경고가 발생하고 값이 1ms로 재설정됩니다. Qt 6.10 이전 버전에서는 Qt Timer에서 음수 간격을 설정할 수 있었지만, 예상치 못한 방식으로 동작했습니다(예를 들어, 타이머가 실행 중이면 중지되거나 아예 시작되지 않는 경우 등).

참고: Qt 6.8 이전버전에서는 이 함수가 chrono::nanoseconds가 아닌 chrono::milliseconds를 매개변수로 받았습니다. 컴파일러가 자동으로 변환해 주지만, 밀리초 값이 극도로 클 경우 변환 과정에서 오버플로가 발생할 수 있습니다.

이 함수는 오버로드된 함수입니다.

참고: 이 함수는 재진입 가능합니다.

start()도 참조하십시오 .

[static] void QTimer::singleShot(std::chrono::nanoseconds nsec, Qt::TimerType timerType, const QObject *receiver, const char *member)

이 정적 함수는 지정된 시간 간격이 지난 후 슬롯을 호출합니다.

이 함수를 사용하면 ‘ timerEvent ’을 신경 쓸 필요도 없고, 로컬 ‘ QTimer ’ 객체를 생성할 필요도 없기 때문에 매우 편리합니다.

receiver 는 수신 객체이고, member 는 슬롯입니다. 시간 간격은 duration 객체 nsec 로 지정됩니다. timerType 는 타이머의 정확도에 영향을 미칩니다.

Qt 6.10부터는 음수의 간격을 설정하면 런타임 경고가 발생하며, 해당 값은 1ms로 재설정됩니다. Qt 6.10 이전 버전에서는 Qt Timer에서 음수 간격을 설정할 수 있었으나, 예상치 못한 동작을 보였습니다(예: 실행 중인 타이머가 중지되거나 아예 시작되지 않는 경우 등).

참고: Qt 6.8 이전버전에서는 이 함수가 chrono::nanoseconds가 아닌 chrono::milliseconds를 매개변수로 받았습니다. 컴파일러가 자동으로 변환해 주지만, 밀리초 값이 극도로 클 경우 변환 과정에서 오버플로가 발생할 수 있습니다.

이 함수는 오버로드된 함수입니다.

참고: 이 함수는 재진입 가능합니다.

start()도 참조하십시오 .

[slot] void QTimer::start(int msec)

msec 밀리초의 타임아웃 간격으로 타이머를 시작하거나 다시 시작합니다.

이는 다음 코드와 동일합니다:

timer.setInterval(msec);
timer.start();

타이머가 이미 실행 중이라면, stopped 후 다시 시작됩니다. 이 경우 타이머의 id() 값도 변경됩니다.

singleShot 가 true인 경우, 타이머는 한 번만 활성화됩니다.

Qt 6.10부터는 음수의 간격을 설정하면 런타임 경고가 발생하고 값이 1ms로 재설정됩니다. Qt 6.10 이전에는 Qt Timer에서 음수 간격을 설정할 수 있었지만, 예상치 못한 방식으로 동작했습니다(예를 들어, 타이머가 실행 중이면 중지되거나 아예 시작되지 않는 등).

참고: 0으로 설정된 타이머로 이벤트 루프를 계속 바쁘게유지하면 문제가 발생하고 UI가 매우 불안정해질 수 있습니다.

참고: 이 슬롯은 오버로드되어 있습니다. 이 슬롯에 연결하려면:

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        timer, qOverload(&QTimer::start));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        timer, [receiver = timer](int msec) { receiver->start(msec); });
더 많은 예제와 접근 방식은 오버로드된 슬롯에 연결하기를 참조하십시오.

[slot] void QTimer::start()

interval 에 지정된 타임아웃을 사용하여 타이머를 시작하거나 다시 시작합니다.

타이머가 이미 실행 중인 경우, ` stopped `로 설정된 후 다시 시작됩니다. 이 경우 타이머의 ` id()` 값도 변경됩니다.

singleShot 가 true인 경우, 타이머는 한 번만 활성화됩니다.

참고: 0 타이머로 이벤트 루프를 계속 바쁘게유지하면 문제가 발생하고 UI가 매우 불안정해질 수 있습니다.

참고: 이 슬롯은 오버로드되어 있습니다. 이 슬롯에 연결하려면:

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        timer, qOverload<>(&QTimer::start));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        timer, [receiver = timer]() { receiver->start(); });
더 많은 예제와 접근 방식은 오버로드된 슬롯에 연결하기를 참조하십시오.

void QTimer::start(std::chrono::milliseconds interval)

interval 밀리초의 타임아웃을 설정하여 타이머를 시작하거나 다시 시작합니다.

이는 다음 코드와 동일합니다:

timer.setInterval(interval);
timer.start();

타이머가 이미 실행 중이라면, stopped 상태로 재시작됩니다. 이 경우 타이머의 id() 값도 변경됩니다.

singleShot 가 true인 경우, 타이머는 한 번만 활성화됩니다.

Qt 6.10부터는 음수의 간격을 설정하면 런타임 경고가 발생하고 값이 1ms로 재설정됩니다. Qt 6.10 이전에는 Qt Timer에서 음수 간격을 설정할 수 있었지만, 예상치 못한 방식으로 동작했습니다(예를 들어, 타이머가 실행 중이면 중지되거나 아예 시작되지 않는 등).

참고: 0 타이머로 이벤트 루프를 계속 바쁘게유지하면 문제가 발생하고 UI가 매우 불안정해질 수 있습니다.

이 함수는 오버로드된 함수입니다.

[slot] void QTimer::stop()

타이머를 중지합니다.

start()도 참조하십시오 .

[private signal] void QTimer::timeout()

이 신호는 타이머가 만료될 때 전송됩니다.

참고: 이 신호는 비공개 신호입니다. 신호 연결에서 사용할 수는 있지만, 사용자가 직접 발생시킬 수는 없습니다.

interval, start() 및 stop()도 참조하십시오 .

[override virtual protected] void QTimer::timerEvent(QTimerEvent *e)

QObject::timerEvent(QTimerEvent *event)를 재구현합니다.

int QTimer::timerId() const

타이머가 실행 중이면 해당 타이머의 ID를 반환하고, 그렇지 않으면 -1을 반환합니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.