[개발일지] 객체지향 프로그래밍과 PySide6 구조 ,Qt Creator 이해

오늘은 객체지향 프로그래밍의 기본 개념과 C# Basic 문법, PySide6의 Signal / Slot 구조, Qt Designer 레이아웃 지정 방법, 그리고 UI와 로직 파일을 분리하는 구조에 대해 학습했다.


1. 객체지향 프로그래밍

객체지향 프로그래밍은 객체를 중심으로 프로그램을 설계하는 방식이다. 데이터와 기능을 하나의 단위로 묶어서 관리하며, 코드의 재사용성과 유지보수성을 높일 수 있다.

class Person
{
    public string name;

    public void Introduce()
    {
        Console.WriteLine("안녕하세요");
    }
}

위 코드에서 Person은 클래스이고, name은 변수, Introduce()는 기능을 담당하는 메서드이다.


2. C# Basic / 의존성

의존성은 한 객체가 다른 객체를 필요로 하는 관계를 의미한다. 예를 들어 자동차 클래스가 엔진 클래스를 사용한다면, 자동차는 엔진에 의존하고 있는 구조이다.

class Engine
{
}

class Car
{
    Engine engine = new Engine();
}

의존성이 강하면 하나의 코드를 수정했을 때 다른 코드에도 영향을 줄 수 있기 때문에 구조 설계가 중요하다.


3. 접근 제어자

접근 제어자는 클래스 내부의 변수나 메서드에 접근할 수 있는 범위를 제한하는 기능이다.

public string name;
private int age;

public은 외부에서도 접근 가능하고, private은 클래스 내부에서만 접근 가능하다.

접근 제어자는 객체지향의 캡슐화 개념과 연결된다.


4. 상속

상속은 기존 클래스를 재사용하여 새로운 클래스를 만드는 개념이다.

class Animal
{
    public void Eat()
    {
    }
}

class Dog : Animal
{
}

Dog 클래스는 Animal 클래스를 상속받았기 때문에 Animal이 가지고 있는 기능을 사용할 수 있다.


5. PySide6 Signal / Slot

PySide6에서는 버튼 클릭, 체크박스 변경, 입력값 변경과 같은 이벤트를 Signal / Slot 구조로 처리한다.

Signal은 이벤트가 발생했음을 알려주는 신호이고, Slot은 그 신호를 받아 실행되는 함수이다.

button.clicked.connect(save_data)

위 코드는 버튼이 클릭되면 save_data 함수가 실행되도록 연결한 것이다.


6. 구조 이해와 값 전달

Signal은 단순히 함수만 실행하는 것이 아니라 변경된 값을 함수로 전달할 수도 있다.

spinBox.valueChanged.connect(show_value)

def show_value(value):
    print(value)

spinBox의 값이 변경되면 변경된 값이 show_value 함수로 전달된다.


7. 사용자 정의 Signal

PySide6에서는 기본 Signal 외에도 직접 Signal을 만들어 사용할 수 있다.

from PySide6.QtCore import Signal, QObject

class MySignal(QObject):
    send_text = Signal(str)

위 코드는 문자열 값을 전달할 수 있는 사용자 정의 Signal을 만든 예시이다.


8. 단일 Signal / 다중 Slot

하나의 Signal에 여러 개의 Slot을 연결할 수 있다.

button.clicked.connect(save_data)
button.clicked.connect(show_message)
button.clicked.connect(clear_input)

버튼을 한 번 클릭하면 저장, 메시지 출력, 입력 초기화가 함께 실행된다.


9. 다중 Signal / 단일 Slot

여러 개의 Signal을 하나의 Slot에 연결할 수도 있다.

button.clicked.connect(update_ui)
checkBox.stateChanged.connect(update_ui)
spinBox.valueChanged.connect(update_ui)

여러 이벤트가 발생해도 같은 함수에서 처리할 수 있기 때문에 코드 중복을 줄일 수 있다.


10. Qt Designer 레이아웃 정렬

Qt Designer에서는 위젯을 직접 좌표로 배치하는 것보다 레이아웃을 사용해서 정렬하는 것이 중요하다.

레이아웃을 사용하면 창 크기가 변경되어도 위젯들이 자동으로 정렬되고, UI가 깨지는 문제를 줄일 수 있다.

  • Vertical Layout : 위아래 배치
  • Horizontal Layout : 좌우 배치
  • Grid Layout : 표 형태 배치
  • Form Layout : 라벨과 입력창 구조 배치

11. UI와 로직 파일 분리

PySide6 프로젝트에서는 디자인 파일과 실제 동작 로직을 분리해서 관리하는 것이 중요하다.

project/
 ├── main.py
 ├── form.ui
 └── ui_form.py

form.ui는 Qt Designer에서 만든 화면 디자인 파일이고, ui_form.py는 ui 파일을 Python 코드로 변환한 파일이다. main.py는 버튼 클릭, 데이터 저장, 삭제, 수정 같은 실제 기능을 작성하는 파일이다.

디자인과 기능을 분리하면 코드가 길어져도 관리하기 쉽고, UI 수정과 기능 수정을 따로 진행할 수 있다.


12. 개인 프로젝트 진행 예시

현재 진행했던 개인 프로젝트 구조로 보면 UI를 담당하는 부분과 로직을 담당하는 부분을 나누어 생각할 수 있다.

UI(디자인) 담당

lineEdit
textEdit
pushButton
listWidget
label
spinBox
stackedWidget
checkBox

위 요소들은 사용자가 직접 보고 상호작용하는 화면 구성 요소이다. 입력창, 버튼, 리스트 출력 영역, 체크박스, 상세 정보 표시 영역 등이 여기에 해당한다.

로직(Main) 담당

save_data()
delete_data()
show_detail()
reset_inputs()
check_option()

위 함수들은 실제 프로그램의 동작을 처리하는 부분이다. 입력값 저장, 데이터 삭제, 상세 내용 표시, 입력 초기화, 조건에 따른 화면 변경 등이 여기에 해당한다.

정리하면 UI 파일은 화면 구성을 담당하고, main 파일은 기능 구현을 담당한다.


오늘 학습 핵심 요약

오늘은 객체지향 프로그래밍의 기본 개념부터 C# Basic 문법, 의존성, 접근 제어자, 상속을 학습했다.

또한 PySide6에서 Signal / Slot 구조를 통해 이벤트를 처리하고 값을 전달하는 방법을 배웠다.

마지막으로 Qt Designer에서 레이아웃을 지정하는 방법과 UI 파일과 main 로직 파일을 분리해서 프로젝트를 구성하는 방식까지 학습했다.

단순히 코드를 작성하는 것뿐만 아니라 프로그램을 구조적으로 설계하고 관리하는 방법을 익히는 시간이었다.

 


13. PySide6 프로젝트 파일 구조와 실행 흐름

PySide6 GUI 프로젝트는 화면 디자인과 프로그램 기능을 분리해서 관리하는 구조로 진행된다.

전체 흐름은 아래와 같다.

Qt Designer (.ui)
      ↓
디자인 클래스.py
      ↓
로직 추가 파일.py
      ↓
main.py 실행

14. Qt Designer (.ui)

Qt Designer에서 직접 화면을 설계하는 단계이다.

버튼, 입력창, 라벨, 리스트 위젯, 체크박스, stackedWidget, 그리고 레이아웃 배치까지 화면 구성 요소를 만드는 파일이다.

form.ui

담당 역할:

  • 화면 배치
  • 버튼 위치 지정
  • 입력창 위치 지정
  • 레이아웃 설정
  • 위젯 objectName 지정

즉, 사용자가 실제로 보게 되는 화면 디자인을 담당하는 파일이다.


15. 디자인 클래스 (.py)

Qt Designer에서 만든 .ui 파일은 바로 Python에서 실행되지 않기 때문에 Python 코드 파일로 변환하는 작업이 필요하다.

pyside6-uic form.ui -o ui_form.py

변환 후 생성되는 파일:

ui_form.py

내부 구조 예시:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        # 위젯 생성
        # 레이아웃 구성
        # 화면 배치

이 파일은 디자인 정보를 Python 코드로 변환한 파일이다.

직접 수정할 수는 있지만, .ui 파일을 다시 변환하면 내용이 덮어쓰기 되기 때문에 일반적으로 직접 수정하지 않는다.


16. 로직 추가 파일 (.py)

디자인 클래스만으로는 프로그램이 동작하지 않기 때문에 실제 기능을 추가하는 로직 파일이 필요하다.

여기에서 버튼 클릭 이벤트, 데이터 저장, 삭제, 수정, 페이지 이동 같은 프로그램 기능을 작성한다.

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.save_data)

    def save_data(self):
        text = self.lineEdit.text()
        print(text)

담당 역할:

  • 버튼 클릭 이벤트 연결
  • 입력값 가져오기
  • 데이터 저장
  • 삭제 / 수정 기능
  • 상세 정보 출력
  • 페이지 이동
  • 조건에 따른 화면 변경

즉, 프로그램의 실제 동작을 담당하는 부분이다.


17. main.py 실행 파일

마지막으로 프로그램을 실행하는 파일이다.

main.py는 프로그램 시작점 역할을 한다.

import sys
from PySide6.QtWidgets import QApplication
from logic import MainWindow

app = QApplication(sys.argv)

window = MainWindow()
window.show()

sys.exit(app.exec())

프로그램 실행 순서:

  • QApplication 생성
  • MainWindow 객체 생성
  • 창 화면 출력
  • 이벤트 루프 실행

18. Qt Designer 레이아웃

Qt Designer에서 위젯을 배치할 때 좌표로 직접 배치하는 방식보다 레이아웃을 사용하는 것이 중요하다.

좌표 방식은 창 크기가 변경될 경우 UI가 깨질 수 있다.

레이아웃을 사용하면 자동 정렬과 크기 조절이 가능하다.


레이아웃 적용 방법

1. 위젯 배치
2. 정렬할 위젯 선택
3. 우클릭
4. Lay out 선택
5. 원하는 레이아웃 적용

레이아웃 종류

Vertical Layout

위에서 아래 방향으로 정렬

[라벨]
[입력창]
[버튼]

Horizontal Layout

왼쪽에서 오른쪽 방향으로 정렬

[라벨] [입력창] [버튼]

Grid Layout

표 형태 구조로 정렬

[이름 라벨] [입력창]
[날짜 라벨] [입력창]
[메모 라벨] [입력창]

Form Layout

입력 양식 구조에 적합

이름 : [입력창]
날짜 : [입력창]
메모 : [입력창]

 


전체 구조 정리

1. Qt Designer에서 화면 설계
2. 위젯 이름 지정
3. 레이아웃 적용
4. .ui 파일 저장
5. Python 코드로 변환
6. 로직 기능 작성
7. main.py 실행

단순히 화면만 만드는 것이 아니라 디자인 → 구조 변환 → 기능 연결 → 실행 흐름으로 프로젝트가 구성된다.