티스토리 뷰

자리바꾸기

Qt 시작

(재시험 본다면 연락 후 5문제일 것)

자리바꾸는게 맵다 (팀 안된사람 일어나게 해서 친구 없냐고 물어봄; 있으면 손을 안뻗어줬냐고…)

회사생활 하려면 자기가 원하는걸 알고 어느정도 어필하는게 필요하다

(3주 지났는데 주변사람 이름 못외웠으면 회사생활 하면 힘들거임…);;

심화실습평가: Qt로 미니 프로젝트

Qt

윈도우만 할거면 굳이 안쓰는데, 아닌 경우에는 꽤 인기있는 프레임워크임

언어는 C++ / python 가능

디자인 로직과 함수 로직을 나누어서 작업할 수 있다

대부분 프레임워크는 디자인/기능 이원화를 지원함

 
Design Logic
Function Logic
Qt Quick
QML
C++
QWidget
C++
C++

MVC (Model - View - Controller)

모델: 데이터 / 뷰: 화면 / 컨트롤러: 제어

(MVCC 등 여러 종류가 있음)

xml : 데이터를 표현하는 방법 (마크업 랭귀지)

html에서의 ml이랑 같음

이메일로 간단하게 계정 만들고 다운받으면 된다

다운중 LGPL

GPL 라이센스: 돈을 안내려면 소스를 공개해야 함

LGPL: GPL보다 약한 라이센스, 출처만 공개하면 됨

(근데 강사님 기억상으로는 임베디드는 LGPL 적용이 아니었던 것 같다고 함)

교재는 6.5버전인데, 지금 LTS는 6.11이라서 교재와 다를 수 있음

Qt Creator

UI 디자인으로 디자인 코드를 작성하는 방법 (VS에서도 비슷한게 내장되어있음)

QWidget

코드로 디자인하는 방법

기본적으로 Qt 라이브러리를 사용할거고, 그건 class로 구성되어있음

콘솔 어플리케이션: 지금까지 우리가 하던거. 검은 화면(콘솔)에 출력

UI Component = Widget

Qt 개발 툴

Qt Creator IDE

Qt Designer: GUI로 C++ 기반 GUI 제작

Qt Design Studio: GUI로 QML 기반 GUI 제작

Visual Studio: Add-in 추가해서 개발 가능

Qt Linguist: 지금은 쓸 일이 없겠지만(실무에서 많이 씀), 다국어 지원을 위해 사용할 수 있음 개쩐다

(보통 영어/한국/일본어 정도를 기본으로 만듦)

한국 사람은 보통 영어로 만든 후, Linguist 툴로 한국어 연결해둠

(다른 프로그램에서도 다 제공하는 기능)

CMake / qmake

빌드 툴로, qt make를 줄여서 이전까지는 qmake가 기본이었었다

CMake가 거의 표준 빌드 툴이니까, (다른 프로그램들도 대부분) CMake로 바뀌는 추세

우리는 Qt Widgets Application / CMake

c++에서 엔트리 포인트를 main으로 했으니까 윈도우 프로그래밍도 main이 있을거임

위젯 프로그래밍이기 때문에 복잡해짐

C에서는 main에 진입하면 창을 띄운다 끝. 할 수 있음

위젯 어플리케이션은, 창을 띄운다가 시작임

기본동작을 하는 윈도우가 QMainWindow이고, 그걸 상속받아서 사용하겠다

main 함수가 이미 만들어져 있음 (정확히는 윈메인)

int main()

qMainWindow *ptr = new MainWindow();

(C++에서 배운 다이나믹 바인딩에 의해… 함수가 정의되고 어쩌구 하겠지)

즉, 메인 윈도우를 ‘나만의 윈도우’로 바꾸는 것부터 시작이다

옵션은 3개로, 위젯 or 다이얼로그 → 윈도우랑은 다른 형태의 특성을 가짐

locale

주요 언어를 선택할 수 있음

영어는 English(United States), 한국어는 Korean을 선택하면 된다

Kit Selection

컴파일 도구 사용할 수 있음

디버그 / 릴리즈 모드 우리가 VS에서 본거랑 똑같다

당연히 개발 시에는 디버그 모드 쓸거임

Project Management

지금은 교육이라 git이든 svn이든 안쓸건데

실무가면 무조건 할거임(형상관리 툴, 버전 컨트롤)

그러면 첫 프로젝트가 만들어져서 main이 보인다

translator는 linguest였나 머시기 그거니까 일단 패스

엥 메인윈도우 만든 적 없는데요? → include “mainwindow.h”

override: 상속받은걸 재정의 하겠다 - 라는 키워드

선조에 virtual 키워드가 붙어있을 것이다

(구현이 없었다면, 순수가상함수 일 것이다..)

소멸자가 잘못되면 메모리 누수가 생길 수 있다(배웠는데 다시봐야할듯)

그래서 실제 소멸자로 잘 해줘야 한다

바디 찾아가도 별거 없다

위에서 UI가 로직과 분리되어 별도로 작업한다고 했다

메인에서 똑같이 빌드 후 실행, 디버깅 등 똑같이 할 수 있고

실행시켜보면 아무것도 없는 창 하나가 뜬다

(다크모드도 기본 탑재한듯)

앞으로는 main함수에서 직접 작업할 일이 많이 없음

많은 작업들은 창 위에 띄울 것

콘솔 어플리케이션을 선택해서 프로젝트를 만들어보니

이번엔 QCoreApplication으로 바뀌었다 (콘솔에서는 더 적은 기능을 지원할테니)

.폴더 : 유저한테 되도록이면 안보였으면 좋겠다 - 라는 뜻

CMakeLists.txt

1: 최소 버전

2: 프로젝트 이름 (CXX → C++을 사용한다)

4: Qt6 6.5이상일 때만 사용하겠다

8: 소스파일을 실행하겠다 (main.cpp 말고 다른 소스파일이 있으면 추가됨)

12: 다국어지원이니까 패스

17: 링크 라이브러리. 기본적으로 나는 어떤 라이브러리를 쓰겠다 → Qt::Core(콘솔이기 때문에 이거만있음)

다시 위젯으로 돌아가서 untitled/CMakeLists.txt

Forms/mainwindow.ui

코드에서는, setupUi()로 ui파일을 가져와서 화면을 띄운다

AUTOUIC: 유저 인터페이스에 대한 컴파일을 자동으로 하겠다

.ui에서 만든 디자인을 코드로 자동으로 생성해주기 위해서 필요하다

AUTOMOC: Meta Object Compiler = (아 설명 빨라서 놓침)

RCC: 리소스 파일을 자동으로 생성해줌

기본 버전을 17로 하겠다

아까는 QT6 Core LinguistTools만 있었는데 아까보다 많아졌다

원래는 여기에 자원들을 설정한다

사용하는 소스들이 적혀있다

CMake는 if()~else()~endif()를 지원한다 → 원하는대로 지정 가능

c.f. 프로젝트가 여러 개 열려 있을 때, 액티브 프로젝트가 아닌 경우 반투명하게 보인다

그래서 여러 프로젝트 열어놔도, 원하는 프로젝트를 Activate Project로 설정하면 그 프로젝트 위주로 작업할 수 있다

(교재에서는 위젯으로 프로젝트 만들어서 위젯이라 뜨는데, 우린 mainwindow로 만들었으니까 ㄱㅊ음)

???: 엥 VS에서는 CMake 안보였는데요

디버그 옵션으로 컴파일러/링커 옵션으로 텍스트 엄청 나왔던거 있지. 그게 CMake 옵션으로 들어가있던거임

c.f.) qmake로 만들면 ‘{프로젝트_이름}.pro’ 파일이 만들어진다

참고로 역슬래시( \ )는 줄바꿈이다

원래 한 줄에 다 써야되는데, 보기 어려우니까 여러 줄로 쓸 수 있게 사용함

.ui파일을 텍스트로 열면, xml 구조가 보인다

untitled\build\Desktop_Qt_6_11_0_MinGW_64_bit-Debug\untitled_autogen\include에

ui_mainwindow.h도 생겼다

아까 CMake 옵션에서 봤던 UIC가 이 헤더 파일을 만든 것을 볼 수 있다

.ui 파일을 여는 방법도 선택할 수 있다

Form Editor가 Design탭으로 넘어가는 기본 옵션이고

Plain Text Editor는 메모장에서 연 것과 같이 xml 형식으로 볼 수 있다

ui파일만 수정했지만, .h에 푸시 버튼이 자동으로 등록되어있는 것을 볼 수 있다.

(오우야 세팅 안건드린 버튼인데 호버링 시 색 변화랑 클릭 시 색 변화까지 적용되어있다 센스 괜찮네)

어떤 위젯이든 이벤트를 받을 수 있으나, 보통은 버튼 등 특정 위젯에 할당함

이벤트는 클릭 뿐만 아니라 모든 행동이다

mouse entered : 마우스가 특정 영역으로 들어감

마우스 클릭은 두 가지 행동 (눌림, 올라옴)이므로 따로 쓸 수도, 같이 쓸 수도 있다

mouse clicked /

Qt에서는 event handler를 slot이라 한다

특정한 위젯의 특정한 동작을 연결해주는 역할

(서브모니터에서 띄우니 해상도차이때문인지 선택지가 정상적으로 안떴다……..)

Go to slot… > QAbstractButton - clicked() 만 선택하면 알아서 함수를 만들어준다.

내부에 출력문 한 줄만 내가 작성했더니, 버튼 누르면 인사하는 예의바른 프로그램이 만들어졌다

Copy
// Source Files > mainwindow.cpp

void MainWindow::on_iAmPushButton_clicked()
{
    qDebug("안녕!\n");
    // qDebug() << "안녕하세요"; // 이 형태도 가능한 듯
}

이벤트가 있고, 동작하는 함수가 있으면

이를 연결해주는 slot ( = event handler)이 있어야 하는 것이다

그래서 내부에서는 이러한 코드가 작성된다

Copy
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(slot_clicked()));
// 이 예시에서는 void Widget::slot_clicked() 함수를 불러낸다

계산기는 다이얼로그 프로그램임

데이터 파일 같은 거 없이 단순한 구조 (그래서 윈도우 프로그래밍보다 다이얼로그를 먼저 함)

엑셀처럼 프로그램 하나에서 여러 창을 띄우는건 MDI (Multi Document 인…뭐지 암튼 그거다)

(교재 목차 짚어보기)

여기까지 slot으로 이벤트핸들러, qt designer로 디자인 설계, QMainWindow로 GUI 구현을 봤다

그리고 필수적인 Stream과 파일 입출력

파일을 통해 qt property를 이용하면 설정파일을 이용할 수 있다…몰라졸려서귀에잘안들어와요

쓰레드 프로그래밍은… 고급 과정이라서 시간 남으면 오히려 xml, json을 공부하게 될 것

(기본적으로 우리가) 데이터베이스를 안쓴다는 가정이라면, xml json으로 관리하게 될 것

임베디드에서 DB를 쓰는 경우는 없지 ㅋ

네트워크는 조금이라도 봐야 할 필요가 있다… (통신을 뺴놓고 프로그래밍은 말안됨

웹소켓은 컴퓨터에서는 흔하긴한데… 임베디드에서는 흠

멀티미디어는… 카메라로 프로젝트 하려면 봐야지 뭐 어떡해

뒤에 PDF같은건 패스할거임

교재에 나온 예제들은 대부분 직접 해봐야하는 것임 (그래서 앞에서 실습을 같이 많이 할 예정)

C랑 C++을 이론 위주로 했더니 학생들이 실제 코딩을 어색하게 느끼는 것 같아 실습 비중을 올릴거임

왜 라이브러리가 QButtonGroup 따로 있지

그 안에서 윈도우면 윈도우용으로, 다른 플랫폼이라면 다른 플랫폼용 버튼으로 바꾸어서 컴파일하는 것

교재에 나온대로 윈도우프로그램 대신 위젯으로 만들어본다

(윈도우로 만들었다가 인클루드랑 파일이름이 달라서 연결이 안되어서 프로젝트 새로 팠다)

아래 예제는 배타적 체크박스와 다중 선택이 가능한 체크박스 UI를 만드는 코드이다.

widget.h

Copy
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QCheckBox>
#include <QButtonGroup>

class Widget : public QWidget{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    QButtonGroup    *m_chk_group[2];
    QCheckBox       *m_exclusive[3];
    QCheckBox       *m_non_exclusive[3];

private slots:
    void slot_chkChanged();
};

#endif // WIDGET_H

widget.cpp

Copy
#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent){
    QString str1[3] = {"Game", "Office", "Develop"};
    QString str2[3] = {"P&rogramming", "Q&t", "O&S"};

    int xpos = 30;
    int ypos = 30;

		// 위젯을 만들 때에는 어떤 Owner(=컨테이너)에 속하는지 지정해준다
		// this이므로, 이 'Widget'이 소유한다는 뜻
    m_chk_group[0] = new QButtonGroup(this);
    m_chk_group[1] = new QButtonGroup(this);

    for(int i=0; i<3; i++){
        m_exclusive[i] = new QCheckBox(str1[i], this);
        m_exclusive[i]->setGeometry(xpos, ypos, 120, 30);
        m_chk_group[0]->addButton(m_exclusive[i]);

        m_non_exclusive[i] = new QCheckBox(str2[i], this);
        m_non_exclusive[i]->setGeometry(xpos + 120, ypos, 120, 30);
        m_chk_group[1]->addButton(m_exclusive[i]);

        connect(m_exclusive[i], SIGNAL(clicked()), this, SLOT(slot_chkChanged()));
        // m_non_exclusive는 연결하지 않았으므로, slot_chkChanged 함수가 동작하지 않음
        // 즉, 콘솔에 안찍힘

        ypos += 40;
    }

    m_chk_group[0]->setExclusive(false);
    m_chk_group[1]->setExclusive(true);
}

void Widget::slot_chkChanged(){
    for(int i = 0; i<3; i++){
        if(m_exclusive[i]->checkState()){
            qDebug("checkbox %d selected ", i+1);
        }
    }
}

Widget::~Widget(){
}

라디오 버튼?

옛날 자동차에 라디오 있을 때, 채널마다 버튼이 있었음

채널 1번 누르면 1번 버튼이 눌려있고, 채널이 1번으로 들리는 것

이 때 채널 4번을 누르면 4번 버튼이 눌리는 동시에, 1번 버튼이 되돌아온다

그래서 라디오 버튼은 배타적으로, 1개만 눌려있는 상태를 유지한다(초기는 당연히 제외겠지)

문자열 QString

c에서 char ar[10]이 c++에서는 string이 되었다

마이크로소프트의 MFC는 ‘클래스’라는 뜻으로 CString이라 하였고

Qt에서는 앞에 q를 붙여서 QString으로 이름지었다 (앞으로도 Q가 붙어있으면, 아하 Qt에서 쓰는거)

(Qt는 한 번 감싼 것이므로, 윈도우에서 작동시키면 cstring으로 작동할 것이고, 리눅스 등이라면 그에 맞게 변화해서 작동할 것이다)

setGeometry(xpos, ypos, 120, 30) : (30, 30)에서 x축(오른쪽)으로 120, y축(아래쪽)으로 30 차지하게 한다

m_chk_group[] : 얘네들이 한 그룹임 (동작 방식을 통일시키기 위해) (Widget::QButtonGroup 타입으로 선언함)

setExclusive(bool) : 배타적/독립적으로 작동할 수 있게 함

qDebug(”%s”, ~)로 m_exclusive[i]- >text() 텍스트를 출력하려고 했으나 안되었다

cannot pass non-trivial object of type to variadic met…

구글 금색 해서 알아낸 결과… 그냥 cout쪽을 알아보는 게 편해보인다…

 

Copy
// Sol 1)
qDebug("%s", m_exclusive[i]->text().toUtf8().constData());

// Sol 2)
qDebug() << checkbox->text();