학습 로그/Python3

D+28 [PyQt] Qt Creator 활용 및 class 이해

goodjop79 님의 블로그 2026. 5. 16. 22:30

ㅇ 일 자 : 2026년 5월 15일(금)
ㅇ 주 제 :  Qt Creator 활용과 클래스 이해
ㅇ 내 용
 
1.  "클래스(class)에 대한 이해"
    가. 외부 수정을 제한하기 위해 변수는 하나의 자료형으로 '캡슐화'한다. 상속을 받아서 확장해서 사용할 수 있다.
    나. 클래스
            원본에 영향을 주지 않는 객체지향 프로그래밍 핵심, 똑같은 모양의 객체를 만들어 내기 위한 설계도(빵틀)
            데이터(속성)과 함수(메서드)를 한데 묶는다
    다. 상속(Inheritance): 
            상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미
            상속은 클래스의 확장 개념이다.
            예) 클래스1을 만들면 만약 중복되는 부분을 하나의 클래스로 만들어 놓고 여러개의 묶음을 생성할 수 있다                      
    라. 추상화(Abstration): 
            클래스에서의 추상화는 모든 사물들을 클래스로 코드화를 해서 만드는 것
            사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것 (공통성과 본질을 모아 추출)
            예)지하철 노선도
    마. 의존성의 문제 : 의지해야만 존재하는 코드, 클래스에 다른 클래스가 있어야만 존재하는 데 유지관리가 어려운 문제가 발생한다
     - 위젯안에 위젯 동물들을 더 추가하고자 할때 의존성 문제로 애러가 발생한다.  
     - 위젯클래스 : 추가부분, 실행부분을 모두 수정해야 하는데 실행하는 부분까지 찾아가서 수정을 해야 하는데 여러명이 공동개발한 프로그램이라면 문제가 발생한다.
     - 개발자1은 '소'를 추가하고, 개발자2는 '호랑이'를 추가했을 때 : 
                추가된 양과 소가 통합되어서 저장되야 하고, 동물원 클래스에는 양과 소가 있어야 하는데 동물원class가 서로 달라 누군가는 통합해야 하는 것이다. 근데 호랑이class를 더 추가해야 할 때 추가부분, 실행부분을 함께 self 수정해야 하는데 여러명이 동시에 수정하게 된다면 기존에 만들어진 실행부까지 찾아가서 수정해 주어야 하니 관리가 매우 어렵게 된다.     

  예) Dependency Inversion : 클래스안에 클래스가 존재해야지만 동작한다.                              
         High level(동물원class) -> Low level Module -> (강아지class,고양이class, 사자class,늑구...)
         High level(동물원class) -> Animal(추상화) -> 강아지class,고양이class,사자,늑구...)

            
        
  ※ 의존성 문제 해결방법 :
      ㅇ 추상화된 인터페이스를 생성한다. (클래스1 --- 인터페이스  --- 클래스2)
      ㅇ 추상화라는 것을 사용하여 공통된 특성을 가진 코드들을 추상화 시킨다.
           예) 사람얼굴 사진 --> 스케치 그림 --> 이모티콘 버튼
      ㅇ 클래스 추상화를 활용하여 외부라이브러리에서 실행부를 받아 사용해도 문제가 발행하지 않는다.
            
(예시 1)     
# from 파일경로 import class에 해당하는 코드를 하단에서 사용(class,ded함수 단위)
# 외부 라이브러리에서 상속받은 클래스(QMainWindow...)

from PySide6.QtWidgets import QApplication, QMainWindow, QLabel

class MyWindow(QMainWindow):   #생성자 객체가 만들어질때 실행되는 초기화 함수
    def __init__(self):        # def함수 추가 확장, class에 객체들 가져와서 사용 
        super().__init__()    
        self.setWindowTitle("QMainWindow Example")  # self 속성 
 
        label = QLabel("Hello QMainWindow!")    
        self.setCentralWidget(label)               # self 속성
 
app = QApplication([])
window = MyWindow()
window.show()
app.exec()

 
(예시 2)
# tests/test_app.py

import unittest   
from app import app  # from 파일경로 import class에 해당하는 코드를 하단에서 사용(class,def 함수 단위)

# 클래스 변수는 하나의 자료형으로 캡슐화한다.   
class TestAppRoutes(unittest.TestCase):   #생성자 객체가 만들어질때 실행되는 초기화 함수 

    def setUp(self):    #추상화 된 ""인터페이스""를 생성한다.   
        self.app = app.test_client()  # self 의존성: 클래스에 다른 클래스가 있어야만 존재하는 것
        self.app.testing = True

    def test_hello_route(self):
        response = self.app.get('/')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data.decode('utf-8'), "Hello, Flask!")

    def test_add_item_route(self):
        response = self.app.post('/items', json={"name": "item1"})
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.get_json(), {'message': 'Item added successfully'})

    def test_get_item_route(self):
        response = self.app.get('/items/0')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get_json(), {'item': {'name': 'item1'}})

    def test_get_nonexistent_item_route(self):
        response = self.app.get('/items/1')
        self.assertEqual(response.status_code, 404)
        self.assertEqual(response.get_json(), {'error': 'Item not found'})

if __name__ == '__main__':
    unittest.main()

#2. Signal & Slot 구조 이해
   가. 시그널 : 어떤 일이 발생했음을 알려주는 신호, 버튼 클릭시 시그널 발생한다    
   나. 슬롯 : 함수 혼자서는 자동실행이 되지 않는다. 시그널과 연결(connect)되서 버튼 클릭시 실행된다.
     button.clicked.connect(button_clickde)  # 버튼 클릭해서 신호가 발생하면, 함수가 자동실행된다.
     
 (예시1)           

from PySide6.QtWidgets import QApplication, QPushButton

# [슬롯으로 사용할 함수] : 버튼 클릭(signal)을 받으면 실행될 함수
def button_clicked():
    print("버튼을 클릭하셨네요!")
# [1] Qt 애플리케이션 생성
#     - 모든 Qt 프로그램은 QApplication 객체가 반드시 하나 필요함
app = QApplication()

# [2] 버튼 위젯 생성
button = QPushButton("Press Me")   # QApplication 위 버튼에 표시될 텍스트

# [3] 시그널과 슬롯 연결
#     - QPushButton은 기본적으로 'clicked' Signal 이 구현되어 있음
#     - 사용자가 버튼을 클릭하면 clicked Signal 이 자동으로 발생(emit)
#     - connect()를 통해 clicked → button_clicked 함수(슬롯) 연결
button.clicked.connect(button_clicked)

# [4] 버튼 화면에 표시
button.show()

# [5] 이벤트 루프 실행
#     - GUI 프로그램이 종료될 때까지 사용자 입력(클릭, 키보드 등)을 처리함
app.exec()


(예시2)

import QtQuick
import QtQuick.Window

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
}


☆파이썬에서 버튼 만들기


☆ Qt에서 디자인 활용하기


☆파이썬에서 Qt 위젯 이해 : 이동바를 실행시켜  슬라이드값 출력값의 이동함을 보여준다


☆ 버튼을 만들어 레이아웃 살펴보기

 

 

2. Signal & Layout

☆ Qt디자인에서 버튼을 끌어놓으면 정렬이 안되었다면 Ctrl+a을 눌러 개체 전부 선택후  Layout정렬을 시켜준다. 버튼정렬됨