로재의 개발 일기
계산기..?
"간단한 계산기를 만들어보자 -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 값)
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)
관련글
※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다
'C_C++ 프로그래밍 > QT' 카테고리의 다른 글
[QT] 메모장을 만들어보자 -2 (0) | 2019.06.23 |
---|---|
[QT] 메모장을 만들어 보자 -1 (0) | 2019.06.22 |
[QT] 간단한 GUI 계산기 만들어보자 -1 (0) | 2019.06.21 |
[QT] QT 5.10 리눅스에서 설치하기! (0) | 2019.06.07 |
댓글