본문 바로가기
C_C++ 프로그래밍/QT

[QT] 간단한 계산기를 만들어보자 -2

by RoJae 2019. 6. 21.

  

    로재의 개발 일기      

계산기..?

"간단한 계산기를 만들어보자 -1"를 통해서는

프로젝트 생성과 기본적인 ui 생성을 진행했습니다.


이번에는 몇 가지 함수를 사용해서

pushButton을 클릭할 때 기능을 구현하여

계산기를 만들어 보겠습니다.


  pushButton_click?

pushButton을 오른쪽 클릭을 하여 go to slot으로 향합니다.


그러면 다음과 같은 창이 생성이 되는데요.


OK를 클릭하시면...




다음과 같은 코드로 이동하는 것을 알 수 있습니다.






 click 모션 작성하기

1
2
3
4
5
6
7
8
9
10
11
// pushButton_00을 클랙했을때 모션
 
void Dialog::on_pushButton_00_clicked()
{
    if(QString::compare(ui->label_op->text(), ""== 0){            // ui의 연산자가 비어 있을 때
        ui->lineEdit_first->setText(ui->lineEdit_first->text() + "0");        // 첫 번째 피연산자에 0추가
    }
    else{
        ui->lineEdit_second->setText(ui->lineEdit_second->text() + "0");    // 두 번째 피연산자에 0
    }
}
cs

다음과 같이 작성을 해주시면 됩니다.

( QT는 C++ 기반이기 때문에 -> 및 ::와 같은 연산자는 부모와 자식의 관계라고 생각하시면 됩니다)

( ui->label_op->text() = ui의 자식 -> label_op의 자식 -> label_op가 가지고 있는 text )


이제 모든 0~9버튼을 다 생성하고 기능에 맞게 작성을 한 뒤에

한번 실행을 시켜서 제대로 작동되는 지 확인해봅니다.


정상적으로 실행이 되네요.

( 두 번째 피연산자는 if문을 통과할 수 없기 때문에 삽입이 안됩니다.)

( 하지만 곧 될 거예요 )



이제는 연산자 기능을 넣어볼게요.

마찬가지로 go to slot을 통해서 아래와 같이 코드를 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// <----- section of adding operator ----> //
 
void Dialog::on_pushButton_plus_clicked()
{
    ui->label_op->setText("+");        // ui의 label_op의 내용을 +로 바꾼다.
}
 
void Dialog::on_pushButton_minus_clicked()
{
    ui->label_op->setText("-");
}
 
void Dialog::on_pushButton_mul_clicked()
{
    ui->label_op->setText("*");
}
 
void Dialog::on_pushButton_deply_clicked()
{
    ui->label_op->setText("/");
}
 
void Dialog::on_pushButton_pow_clicked()
{
    ui->label_op->setText("^");
}
 
void Dialog::on_pushButton_sqrt_clicked()
{
    ui->label_op->setText("√");
}
 
// <---- section of adding operator end ----> //
cs



마찬가지로 clear버튼과 close 버튼도 작성해줍니다.

1
2
3
4
5
6
7
8
// clear button
void Dialog::on_pushButton_clear_clicked()
{
    ui->lineEdit_first->setText("");        // ui의 lineEdit_first의 내용을 ""으로 바꾼다.
    ui->label_op->setText("");
    ui->lineEdit_second->setText("");
    ui->lineEdit_result->setText("");
}
cs


1
2
3
4
5
// window close = exit
void Dialog::on_pushButton_exit_clicked()
{
    this->close();
}
cs

정상적으로 실행이 될까요?




정상적으로 실행이 됩니다.



 변수 만들기

결과를 알기 위해서는 첫 번째 입력과 두 번째 입력을 알아야 합니다.

그리고 그 데이터를 저장하기 위해서 변수를 사용해야 합니다.


이를 위해서 dialog.h 헤더 파일로 향합니다.

그리고 double first, second를 작성합니다.


이제 우리는 이 변수들을 사용할 거예요.



 결과를 출력하자!

위에서 언급한 go to slot 속성을 통해서 pushButton의 click 모션을 생성합니다.

그리고 제곱근과 제곱 값을 구해 줄 qSqrt와 qPow의 헤더 파일을 불러옵니다.

이를 사용해서 우리는 루트 값과 제곱 값을 구할 거예요.

(가장 상단에 작성)


1
#include "qmath.h"    // qSqrt 및 qPow 헤더 파일
cs


- qPow(a, b)

a의 b승을 구하는 연산

- qSqrt(a)

a의 제곱근을 구하는 연산입니다.

(간단히 말하면 루트 씌운 a 값)



d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// result print button
void Dialog::on_pushButton_result_clicked()
{
    first = ui->lineEdit_first->text().toDouble();       
    second = ui->lineEdit_second->text().toDouble();
 
    if(ui->label_op->text() == "+"){
        ui->lineEdit_result->setText(QString::number(first + second));
    }
    else if(ui->label_op->text() == "-"){
        ui->lineEdit_result->setText(QString::number(first - second));
    }
    else if(ui->label_op->text() == "*"){
        ui->lineEdit_result->setText(QString::number(first * second));
    }
    else if(ui->label_op->text() == "/"){
        ui->lineEdit_result->setText(QString::number(first / second));
    }
    else if(ui->label_op->text() == "^"){
        ui->lineEdit_result->setText(QString::number(qPow(first, second)));
    }
    else if(ui->label_op->text() == "√"){
        ui->lineEdit_result->setText(QString::number(qSqrt(first)));
    }
}
 
cs

first 변수에는 첫 번째 피연산자가 들어가게 되고

second 변수에는 두 번째 피연산자가 들어가게 됩니다.


그리고 ui에 있는 연산자가 어떠한 연산자 인지!

확인하는 if문을 통해서 lineEdit_result의 값을 출력해줍니다.




마무리

정상적으로 출력이 잘 됩니다.


하지만

double의 범위를 벗어나는 계산은 정상적으로 실행 할 수가 없습니다.

double의 범위 = 1.79E-308(-1.79*10^308) ~ 1.79E+308(1.79*10^308) (15digits)


관련글


※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다

댓글