수색…


비고

QTimer를 사용하여 이벤트 루프가 다른 모든 보류중인 이벤트를 처리하는 즉시 함수를 실행하도록 요청할 수도 있습니다. 이렇게하려면 0ms 간격을 사용하십시오.

// option 1: Set the interval to 0 explicitly.
QTimer *timer = new QTimer;
timer->setInterval( 0 );
timer->start();

// option 2: Passing 0 with the start call will set the interval as well.
QTimer *timer = new QTimer;
timer->start( 0 );

// option 3: use QTimer::singleShot with interval 0
QTimer::singleShot(0, [](){
    // do something
});

간단한 예

다음 예는 QTimer 를 사용하여 1 초마다 슬롯을 호출하는 방법을 보여줍니다.

이 예제에서는 QProgressBar 를 사용하여 값을 업데이트하고 타이머가 제대로 작동하는지 확인합니다.

main.cpp

#include <QApplication>

#include "timer.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Timer timer;
    timer.show();

    return app.exec();
}

timer.h

#ifndef TIMER_H
#define TIMER_H

#include <QWidget>

class QProgressBar;

class Timer : public QWidget
{
    Q_OBJECT

public:
    Timer(QWidget *parent = 0);

public slots:
    void updateProgress();

private:
    QProgressBar *progressBar;
};

#endif

timer.cpp

#include <QLayout>
#include <QProgressBar>
#include <QTimer>

#include "timer.h"

Timer::Timer(QWidget *parent)
    : QWidget(parent)
{
    QHBoxLayout *layout = new QHBoxLayout();

    progressBar = new QProgressBar();
    progressBar->setMinimum(0);
    progressBar->setMaximum(100);

    layout->addWidget(progressBar);
    setLayout(layout);

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Timer::updateProgress);
    timer->start(1000);

    setWindowTitle(tr("Timer"));
    resize(200, 200);
}

void Timer::updateProgress()
{
    progressBar->setValue(progressBar->value()+1);
}

timer.pro

QT += widgets

HEADERS = \
          timer.h
SOURCES = \
           main.cpp \
           timer.cpp

람다 기능을 가진 싱글 슬롯 타이머

단일 슬롯 타이머가 필요한 경우 타이머가 선언 된 위치에서 람다 함수로 슬롯을 사용하는 것이 편리합니다.

QTimer::singleShot(1000, []() { /*Code here*/ } );

이 버그 로 인해 (QTBUG-26406) Qt5.4 이후에만 가능합니다.

이전 버전의 Qt5에서는 더 많은 보일러 플레이트 코드를 사용해야합니다.

  QTimer *timer = new QTimer(this);
  timer->setSingleShot(true);

  connect(timer, &QTimer::timeout, [=]() {
    /*Code here*/
    timer->deleteLater();
  } );

QTimer를 사용하여 주 스레드에서 코드 실행

void DispatchToMainThread(std::function<void()> callback)
{
    // any thread
    QTimer* timer = new QTimer();
    timer->moveToThread(qApp->thread());
    timer->setSingleShot(true);
    QObject::connect(timer, &QTimer::timeout, [=]()
    {
        // main thread
        callback();
        timer->deleteLater();
    });
    QMetaObject::invokeMethod(timer, "start", Qt::QueuedConnection, Q_ARG(int, 0));
}

이 기능은 스레드에서 UI 요소를 업데이트해야하는 경우에 유용합니다. 평생 무슨 일이 콜백을 참조하십시오.

DispatchToMainThread([]
{
    // main thread
    // do UI work here
});

Qt 이벤트 루프를 실행하는 모든 스레드에서 동일한 코드를 실행하여 간단한 디스패치 메커니즘을 구현할 수 있습니다.

기본 사용법

QTimer 는 일정한 간격 후에 (반복적으로 또는 단 한 번) 특정 기능 / 슬롯을 호출하는 기능을 추가합니다.

따라서 QTimer 를 사용하면 GUI 응용 프로그램에서 정기적으로 작업을 확인하거나 타이머를 메인 이벤트 루프에서 처리하므로 수동으로 추가 스레드를 시작하고 경쟁 조건에주의 하지 않고도 시간 초과 처리 할 수 ​​있습니다.

타이머는 다음과 같이 간단하게 사용할 수 있습니다.

QTimer* timer = new QTimer(parent); //create timer with optional parent object
connect(timer,&QTimer::timeout,[this](){ checkProgress(); }); //some function to check something
timer->start(1000); //start with a 1s interval

시간이 끝나면 타이머가 timeout 신호를 트리거하고 이는 메인 이벤트 루프에서 호출됩니다.

QTimer :: singleShot 간단한 사용법

QTimer :: singleShot 은 n ms 후에 슬롯 / lambda를 비동기 적 으로 호출하는 데 사용됩니다.

기본 구문은 다음과 같습니다.

QTimer::singleShot(myTime, myObject, SLOT(myMethodInMyObject()));

myTime 은 ms로, myObject 는 메서드를 포함하고 myMethodInMyObject 는 호출 할 슬롯을 포함합니다.

그래서 예를 들어 디버그 라인 "hello!"를 쓰는 타이머를 원한다면 5 초마다 :

.cpp

void MyObject::startHelloWave()
{
    QTimer::singleShot(5 * 1000, this, SLOT(helloWave()));
}

void MyObject::helloWave()
{
    qDebug() << "hello !";
    QTimer::singleShot(5 * 1000, this, SLOT(helloWave()));
}

.hh

class MyObject : public QObject {
    Q_OBJECT
    ...
    void startHelloWave();

private slots:
    void helloWave();
    ...
};


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow