QTimer 사용해보기

QTimer 클래스는 지정한 시간을 기준으로 반복해 호출할 수 있다.

QTimer 클래스는 stop() 멤버 함수를 이용해 타이머를 정지할 수 있다. 만약 타이머를 반복해서 실행하지 않고 단 한번만 호출되도록 하기 위해 singleShot() 멤버 함수를 사용하면 된다.

 

QTimer::singleShot(200, this, SLOT(updateCaption()));

singleShot() 멤버 함수의 첫 번째 인자는 경과 되는 시간이며 단위는 밀리 세컨드 이다.

그리고 세번째 인자는 첫 번째 인자의 시간이 경과된 후 호출될 Slot 함수를 지정하면 된다.


현재 시간 코드

헤더파일

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void currentClock();

private:
    Ui::Widget *ui;
    QTimer *currentTimer;
};
#endif // WIDGET_H

 

cpp 파일

#include "widget.h"
#include "ui_widget.h"
#include "calculator.h"

#include <QDateTime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    currentTimer = new QTimer(this);

    connect(currentTimer, SIGNAL(timeout()), this, SLOT(currentClock()));

    currentTimer->start(1000);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::currentClock(){
    QTime time = QTime::currentTime();
    QString time_text = time.toString("hh : mm : ss");

    ui->label_current_time->setText(time_text);
}

 

slot 함수 구현 부분 (currentClock())

QTime 객체 생성 후 QTime의 멤버 함수인 currentTime을 불러와 현재 시간을 불러 온다.

QString에 "hh : mm : ss" 값으로 파싱한 후

라벨에 넣는다.


특정 시간까지 남은 시간 코드

헤더파일

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void currentClock();
    void leaveWorkClock();
    void btn_calculator();

private:
    Ui::Widget *ui;
    QTimer *leaveWorkTimer;
};
#endif // WIDGET_H

 

cpp 파일

#include "widget.h"
#include "ui_widget.h"
#include "calculator.h"

#include <QDateTime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    leaveWorkTimer = new QTimer(this);

    connect(leaveWorkTimer, SIGNAL(timeout()), this, SLOT(leaveWorkClock()));

    leaveWorkTimer->start(1000);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::leaveWorkClock(){
    QTime time = QTime::currentTime();
    QTime targetTime(18,0,0);

    int secondsToTarget = time.secsTo(targetTime);

    if(secondsToTarget < 0){
        secondsToTarget += 24 * 60 * 60;
    }

    int hours = secondsToTarget / 3600;
    int minutes = (secondsToTarget % 3600) / 60;
    int seconds = secondsToTarget % 60;

    QString time_text = QString("%1 : %2 : %3")
                            .arg(hours)
                            .arg(minutes)
                            .arg(seconds);

    ui->label->setText(time_text);
    ui->label->setStyleSheet("color: red");
}

 

slot 함수 구현 부분 (leaveWorkClock())

QTime 객체를 생성 후 QTime의 멤버 함수인 currentTime을 사용해 현재 시간을 가져온다.

QTime 객체를 생성 후 18시 값을 targetTime 객체에 저장한다.

targetTime을 초단위로 바꾼 값을 secondsToTarget에 넣는다.

 

예외 처리부분에서는

퇴근 시간이 넘어가게 되면 다음날의 18시를 계산한다.

 

시간은 현재 시간의 3600초를 나눈 몫

분은 3600초를 나눈 나머지 값에 60을 나눈 몫

초는 60초를 나눈 나머지 값을 가져간다.

 

Qstring에 파싱 후 라벨에 넣는다.


결과