서론

 

타이머 UI이다.

시 분 초를 설정할 수 있으며 START, STOP, RESET 버튼을 만들었다.

시간이 종료되면 QMessageBox가 출력되는 프로그램을 만들어 보자.


코드

timer.h

#ifndef TIMER_H
#define TIMER_H

#include <QDialog>
#include <QTimer>


namespace Ui {
class Timer;
}

class Timer : public QDialog
{
    Q_OBJECT

public:
    explicit Timer(QWidget *parent = nullptr);
    ~Timer();

private:
    Ui::Timer *ui;
    QTimer *timer;
    int totalSeconds = 0;

private slots:
    void btn_start();
    void btn_stop();
    void btn_reset();
    void updateTimer();
};

#endif // TIMER_H

 

timer.cpp

#include "timer.h"
#include "ui_timer.h"

#include <QMessageBox>

Timer::Timer(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Timer),
    timer(new QTimer(this))
{
    ui->setupUi(this);

    connect(ui->btn_start, SIGNAL(clicked(bool)), this, SLOT(btn_start()));
    connect(ui->btn_stop, SIGNAL(clicked(bool)), this, SLOT(btn_stop()));
    connect(ui->btn_reset, SIGNAL(clicked(bool)), this, SLOT(btn_reset()));
    connect(timer, SIGNAL(timeout()), this, SLOT(updateTimer()));

    ui->btn_stop->setEnabled(false);
}

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

 

슬롯 함수

btn_start()

void Timer::btn_start()
{
    ui->btn_start->setEnabled(false);
    ui->btn_stop->setEnabled(true);

    int hour = ui->hourBox->value();
    int min = ui->MinBox->value();
    int second = ui->SecBox->value();

    totalSeconds = hour*3600 + min*60 + second;

    if(!timer->isActive()){
        timer->start(1000);
    }
}
  • 시작버튼 비활성화 / 정지버튼 활성화
  • 시, 분, 초 값을 가져오기
  • 전체 시간에 표기
  • 1초 단위로 timer 시작

btn_stop()

void Timer::btn_stop()
{
    ui->btn_start->setEnabled(true);
    ui->btn_stop->setEnabled(false);

    if(timer->isActive()){
        timer->stop();
    }
}
  • 시작 버튼 활성화 / 정지 버튼 비활성화
  • 타이머가 시작된 상태면 정지

btn_reset()

void Timer::btn_reset()
{
    ui->hourBox->setValue(0);
    ui->MinBox->setValue(0);
    ui->SecBox->setValue(0);
    ui->btn_start->setEnabled(true);
    ui->btn_stop->setEnabled(false);
    totalSeconds=0;
}
  • 모든 상태 초기화

updateTimer()

void Timer::updateTimer()
{
    if(totalSeconds > 0){
        totalSeconds--;
        int hours = totalSeconds / 3600;
        int minutes = (totalSeconds % 3600) / 60;
        int seconds = totalSeconds % 60;

        ui->hourBox->setValue(hours);
        ui->MinBox->setValue(minutes);
        ui->SecBox->setValue(seconds);
    } else {
        timer->stop();
        QMessageBox::information(this, "Timer", "Time's up!");
    }
}
  • 전체 시간이 남아있을 때 1초마다 1씩 감소
  • 전체 시간을 기준으로 시, 분, 초 계산 후 spinbox에 표시
  • 시간이 0 이하면 메세지 출력

결과