ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [QT] 간단한 계산기를 만들어보자 -2
    C_C++ 프로그래밍/QT 2019. 6. 21. 01:19

      

        로재의 개발 일기      

    계산기..?

    "간단한 계산기를 만들어보자 -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)


    관련글


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

    반응형
Designed by Tistory.