QTimer Class

QTimer 클래스는 반복 및 단일 샷 타이머를 제공합니다. 더 보기...

Header: #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 msec)
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밀리초) 타이머의 예( 아날로그 시계 예제에서):

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

이때부터 update() 슬롯이 매 초마다 호출됩니다.

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

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

멀티스레드 애플리케이션에서는 이벤트 루프가 있는 모든 스레드에서 QTimer를 사용할 수 있습니다. GUI가 아닌 스레드에서 이벤트 루프를 시작하려면 QThread::exec()를 사용합니다. Qt는 타이머의 thread affinity 를 사용하여 timeout() 신호를 방출할 스레드를 결정합니다. 따라서 해당 스레드에서 타이머를 시작하고 중지해야 하며 다른 스레드에서 타이머를 시작할 수 없습니다.

특수한 경우로, 타임아웃이 0인 QTimer는 가능한 한 빨리 타임아웃되지만, 제로 타이머와 다른 이벤트 소스 간의 순서는 지정되지 않습니다. 제로 타이머를 사용하여 일부 작업을 수행하면서도 빠른 사용자 인터페이스를 제공할 수 있습니다:

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

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

정확도 및 타이머 해상도

타이머의 정확도는 기본 운영 체제 및 하드웨어에 따라 다릅니다. 대부분의 플랫폼은 1밀리초의 해상도를 지원하지만 타이머의 정확도는 많은 실제 상황에서 이 해상도와 같지 않습니다.

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

Qt::CoarseTimerQt::VeryCoarseTimer 유형의 경우 해당 유형의 여백 범위 내에서 QTimer가 예상보다 일찍 깨어날 수 있습니다: Qt::CoarseTimer 의 경우 간격의 5%, Qt::VeryCoarseTimer 의 경우 500ms.

시스템이 사용 중이거나 요청된 정확도를 제공할 수 없는 경우 모든 타이머 유형이 예상보다 늦게 시간 초과될 수 있습니다. 이러한 타임아웃 오버런의 경우, 여러 타임아웃이 만료된 경우에도 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 의 하위 클래스여야 함) 다음 접근 방식 중 하나를 사용하는 것입니다:

  • 타이머 ID를 감싸는 경량 값 클래스인 QBasicTimer 를 사용합니다. 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입니다.

[bindable] interval : int

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

이 속성은 시간 초과 간격을 밀리초 단위로 유지합니다.

이 속성의 기본값은 0입니다. 시간 초과 간격이 0인 QTimer 은 창 시스템의 이벤트 대기열에 있는 모든 이벤트가 처리되는 즉시 시간 초과됩니다.

실행 중인 타이머의 간격을 설정하면 타이머가 stop()로 변경된 다음 start()로 변경되고 새로운 id()가 획득됩니다. 타이머가 실행되고 있지 않으면 간격만 변경됩니다.

singleShot참조하세요 .

[read-only] remainingTime : const int

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

타임아웃까지 남은 타이머의 남은 시간(밀리초)을 반환합니다. 타이머가 비활성 상태인 경우 반환되는 값은 -1이고, 타이머가 기한이 지난 경우 반환되는 값은 0입니다.

함수에 액세스합니다:

int remainingTime() const

interval참조하세요 .

[bindable] singleShot : bool

참고: 이 프로퍼티는 QProperty 바인딩을 지원합니다.

이 속성은 타이머가 싱글샷 타이머인지 여부를 보유합니다.

싱글샷 타이머는 한 번만 실행되고, 비싱글샷 타이머는 interval 밀리초마다 실행됩니다.

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

intervalsingleShot()도 참조하세요 .

[bindable] timerType : Qt::TimerType

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

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

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

Qt::TimerType참조하세요 .

멤버 함수 문서

[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, Qt::TimerType timerType, const QObject *context, Functor &&functor)

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

이 정적 함수는 interval 뒤에 functor 을 호출합니다.

이 함수를 사용하면 timerEvent 또는 로컬 QTimer 객체를 만들 필요가 없으므로 매우 편리합니다.

context 을 지정하면 functorcontext 객체가 간격이 발생하기 전에 파괴되지 않은 경우에만 호출됩니다. 그러면 이 함수는 context 의 스레드를 실행하게 됩니다. 컨텍스트의 스레드에는 실행 중인 Qt 이벤트 루프가 있어야 합니다.

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

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

참고: 6.8 이전 Qt 버전에서 크로노 오버로드는 크로노::나노초가 아닌 크로노::밀리초를 사용했습니다. 컴파일러가 자동으로 변환하지만, 밀리초 수가 매우 큰 경우 변환이 오버플로될 수 있습니다.

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

start()도 참조하세요 .

[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)

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

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

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

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

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] void QTimer::singleShot(std::chrono::nanoseconds nsec, const QObject *receiver, const char *member)

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

이 정적 함수는 주어진 시간 간격 후에 슬롯을 호출합니다.

이 함수를 사용하면 timerEvent 또는 로컬 QTimer 객체를 만들 필요가 없으므로 매우 편리합니다.

receiver 은 수신 객체이고 member 은 슬롯입니다. 시간 간격은 기간 객체 nsec 에 지정됩니다.

참고: 6.8 이전 Qt 버전에서 이 함수는 chrono::나노초가 아닌 chrono::밀리초를 사용했습니다. 컴파일러가 자동으로 변환하지만 밀리초 수가 매우 큰 경우 변환이 오버플로될 수 있습니다.

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

start()도 참조하세요 .

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

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

이 정적 함수는 주어진 시간 간격 후에 슬롯을 호출합니다.

이 함수를 사용하면 timerEvent 또는 로컬 QTimer 객체를 만들 필요가 없으므로 매우 편리합니다.

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

참고: 6.8 이전 Qt 버전에서 이 함수는 chrono::나노초가 아닌 chrono::밀리초를 사용했습니다. 컴파일러가 자동으로 변환하지만, 밀리초 수가 매우 큰 경우 변환이 오버플로될 수 있습니다.

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

start()도 참조하세요 .

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

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

타이머가 이미 실행 중이면 stopped 으로 변경되어 다시 시작됩니다. 그러면 id()도 변경됩니다.

singleShot 이 참이면 타이머가 한 번만 활성화됩니다. 이는 다음과 같습니다:

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

참고: 0 타이머로 이벤트 루프를 계속 사용 중으로 유지하면 UI에 문제가 발생하고 매우 불규칙한 동작이 발생할 수 있습니다.

[slot] void QTimer::start()

이 함수는 start()를 오버로드합니다.

interval 에 지정된 타임아웃으로 타이머를 시작하거나 다시 시작합니다.

타이머가 이미 실행 중이면 stopped 이 되어 다시 시작됩니다. 그러면 id()도 변경됩니다.

singleShot 이 참이면 타이머는 한 번만 활성화됩니다.

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

이 함수는 과부하된 함수입니다.

시간 제한이 msec 밀리초인 타이머를 시작하거나 다시 시작합니다.

타이머가 이미 실행 중이면 stopped 으로 변경되어 다시 시작됩니다. 그러면 id()도 변경됩니다.

singleShot 이 참이면 타이머는 한 번만 활성화됩니다. 이는 다음과 같습니다:

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

[slot] void QTimer::stop()

타이머를 중지합니다.

start()도 참조하세요 .

[private signal] void QTimer::timeout()

이 신호는 타이머가 시간 초과되면 발산됩니다.

참고: 이 신호는 비공개 신호입니다. 신호 연결에서 사용할 수 있지만 사용자가 방출할 수는 없습니다.

interval, start() 및 stop()도 참조하세요 .

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

다시 구현합니다: QObject::timerEvent(Q타이머이벤트 *이벤트).

int QTimer::timerId() const

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

© 2025 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.