본문 바로가기
교육관련/한화비전 VEDA 수강일지

[VEDA 1기 수강일지] 16일차 - Qt / C++ (1) : Qt 튜토리얼, label, PushButton

by 김수효 2024. 8. 5.
수강한 개념

 

Qt

- C++ 기반 GUI 툴

- 약간 웹 하는것 같음... winform  하고는 또 다른 느낌...?

- 여러 위젯들이 클래스로 만들어져 있고 Signal과 Slot으로 통신

- 필요한 클래스 불러와서 블럭맞추기 하면 됨

 

label

- 텍스트 박스 같은거

- 이미지도 넣을 수 있다고 함

 

PushButton

- 버튼

- 진짜로 그냥 그 버튼

 

문제 구현 / 개선방안

 

계산기 만들기

어엇... 하 씨..... 뭘 건드렸더니 안된다

추후 수정 예정

#include "widget.h"
#include "./ui_widget.h"
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>

//계산기 일부만 구현
const char* ButtonChar[2][4] = { 
    {"1","2","3","+"},
    {"0","C","=","-"}
};

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

    m_label = new QLabel("0",this);
    m_label->setGeometry(10,5,230,40);
    m_label->setAlignment(Qt::AlignRight | Qt::AlignVCenter); //숫자창

    for(int y = 0; y < 2; y++)
    {
        for(int x = 0; x < 4; x++)
        {
            buttons[4*y+x] = new QPushButton(ButtonChar[y][x],this);
            buttons[4*y+x]->setGeometry(5+60*x, 50+60*y, 60, 60);
        }
    }
    
	
    connect(buttons[0],SIGNAL(clicked()),SLOT(setNum()));
    connect(buttons[1],SIGNAL(clicked()),SLOT(setNum()));
    connect(buttons[2],SIGNAL(clicked()),SLOT(setNum()));
    connect(buttons[4],SIGNAL(clicked()),SLOT(setNum()));//넘버패드
    connect(buttons[3],SIGNAL(clicked()),SLOT(setOp()));
    connect(buttons[7],SIGNAL(clicked()),SLOT(setOp()));//+,-

    //signal, slot과 람다식은 함께 사용 X
    connect(buttons[5],&QPushButton::clicked,this, [=](){m_label->setText("0");});//c

    connect(buttons[6],&QPushButton::clicked,this,[this]() //=
            {
                qreal result=0;
                m_isFirst = true;
                if(m_op == "+")
                    result = m_num1.toDouble() + m_label->text().toDouble();
                else if(m_op == "-")
                    result = m_num1.toDouble() - m_label->text().toDouble();
                else{
                    m_label->setText("Error");
                    return;
                }
                m_label->setText(QString::number(result));
            });

    this->resize(300, 200);
    setMinimumSize(250,295);
    setMaximumSize(250,295);
    setWindowTitle("Calculator");
}


Widget::~Widget()
{
    delete ui;
    for(int i=0; i<8; i++){
        delete buttons[i];
    }
}

void Widget::setNum()
{
    QPushButton *button = dynamic_cast<QPushButton*>(sender());
    QString bStr;
    if(button != nullptr) bStr = button->text();
    if(m_label != nullptr){
        QString lStr = m_label->text();
        m_label->setText((lStr == "0"||m_isFirst)?bStr:lStr+bStr);
        m_isFirst = false;
    }
}

void Widget::setOp()
{
    QPushButton *button = dynamic_cast<QPushButton*>(sender());
    if(button != nullptr) m_op = button->text();
    if(m_label != nullptr){
        m_num1 = m_label->text();
        m_isFirst = true;
    }
}

 

기타 사항

 

재미는 있는데 아직 감을 잘 못잡겠다 이게 대체 머고

 

 


VEDA 바로가기 : www.vedacademy.co.kr

VEDA(한화비전 아카데미) 영상으로 확인하기 : https://url.kr/zy9afd

본 후기는 VEDA(한화비전 아카데미) 1기 학습 기록으로 작성되었습니다.

 

 

댓글