728x90

 

1. 학습 목표

:  Signal/Slot 사용할 때, 값(Data)를 전달하는 구조 파악하기

더보기
  1. Signal 발생시 값(data) 을 Slot 함수에게 전달하는 구조 이해
  2. QPushButton의 clicked(bool) Signal 의 사용
  3. Slot 함수가 Signal 의 인자를 자동으로 전달받는 원리 이해
  4. PySide6에서 값 전달 이벤트 처리를 구현

 

2. Signal / Slot 개념 이해하기

: QPushButton의 clicked Signal 구조

더보기

1) Signal

    • clicked 신호는 단순히 “버튼이 클릭됐다”가 아니라
      clicked(bool) 형태로 동작하며, 내장 Signal이 bool 값을 자동 전달하도록 구현됨
    • Signal: clicked(bool)
      • “버튼이 클릭되었다”는 이벤트 알림(버튼이 checkable일 때)
      • True: 버튼이 체크됨
      • False: 체크 해제됨

 

 

2) Slot

  • signal 다음 실행되는 함수
  • 특별한 문법 없이 일반 함수도 slot처럼 사용 가능

 

 

3) connect

button.clicked.connect(button_clicked)
  • Signal → Slot 연결 문법(syntax)
  • clicked 라는 Signal 이 발생하면 → button_clicked() 이라는 Slot 함수가 자동 호출

 

3. 예제 코드

더보기

A. 파이참에서 프로젝트 생성하기

 

파이참에서 프로젝트 생성하기

1. 일반 프로젝트 생성하기더보기 2. 새 프로젝트 시작하기더보기Case A. 새 프로젝트 생성 Case B. 새 프로젝트 생성 Case C. 새 프로젝트 생성 3. 커스텀 가상환경으로 프로젝트 시작하기 더보기

basiclike.tistory.com

 


B. 예제 코드

from PySide6.QtWidgets import QApplication, QPushButton

def button_clicked(data):
    print("버튼을 클릭하셨네요! 현재 체크 상태 :", data)

app = QApplication()

button = QPushButton("Press Me")

button.setCheckable(True)

button.clicked.connect(button_clicked)

button.show()

app.exec()

 

개념  설명
setCheckable(True)
버튼을 체크/언체크 가능한 토글 버튼으로 전환
clicked(bool) 클릭될 때 자동으로 bool 값을 전달하는 Signal
Slot(data) Signal이 전달한 값을 파라미터로 자동 수신
connect() Signal에서 전달되는 값을 Slot에 연결하고 전달하는 메커니즘

 

 

C. 예제파일

main.py
0.00MB

 

4. 코드 분석

더보기

A. 주석 처리된 코드

from PySide6.QtWidgets import QApplication, QPushButton

# [슬롯 함수] : clicked(bool) Signal에서 전달된 값을 받는 함수
def button_clicked(data):
    print("버튼을 클릭하셨네요! 현재 체크 상태 :", data)

# [1] Qt 애플리케이션 생성
app = QApplication()

# [2] 버튼 생성
button = QPushButton("Press Me")

# [3] 버튼을 Checkable 상태로 변경
#     - 기본 버튼은 누르고 떼면 바로 원상태(비체크)
#     - setCheckable(True)를 적용하면 클릭할 때마다 True/False로 토글됨
button.setCheckable(True)

# [4] Signal과 Slot 연결
#     - clicked(bool) 신호는 자동으로 bool 값을 슬롯 함수로 전달
#     - data 매개변수는 clicked 신호가 전달하는 True/False 값을 받음
button.clicked.connect(button_clicked)

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

# [6] 이벤트 루프 실행
app.exec()

 

 

B. 단계별 분석

from PySide6.QtWidgets import QApplication, QPushButton

B.1 라이브러리 가져오기

  • QApplication: Qt 앱 생명주기 관리
  • QPushButton: 클릭 가능한 버튼 위젯

 

def button_clicked(data): print("버튼을 클릭하셨네요! 현재 체크 상태 :", data)

 B.2 Slot 함수 정의

  • Signal이 emit한 bool 값이 자동으로 data에 전달됨
  • True: 버튼이 체크된 상태
  • False: 체크 해제된 상태
  • Slot 함수룰 구현할 때는, Signal의 구조에 따라 파라미터 수와 타입에 맞게 정의해야 함

 

app = QApplication()

B.3 QApplication 생성

 
 
 
button = QPushButton("Press Me") button.setCheckable(True)
 B.4 버튼 생성 + Checkable 설정
  • checkable=True → 토글 버튼 기능 제공
  • 클릭할 때마다 checked 상태가 변함 (True ↔ False)

 

button.clicked.connect(button_clicked)

B.5 Signal / Slot 연결

Signal → Slot 흐름:
  1. 사용자가 버튼 클릭
  2. clicked(bool) Signal emit (전달)
  3. 해당 bool 값이 Slot 함수로 전달
  4. Slot 함수 실행하며, 전달받은 bool 값 로직에서 사용

 

button.show()

B.6 버튼 표시

 

 

app.exec()

B.7 앱 실행

app.exec()은 프로그램이 종료될 때까지 반환되지 않습니다.
# 예시, print 코드는 GUI 창을 닫아야 다음 줄이 실행됩니다.
app.exec()
print("여기는 앱이 닫힌 뒤에 실행됨")


5. Qt 에서 구현

더보기

A. Qt for Python 프로젝트 생성

 

Qt for Python 프로젝트 생성

1. Qt for Python 템플릿으로 프로젝트 생성더보기 2. 실행 테스트더보기

basiclike.tistory.com

 

 

 

 

B.

 

 

 

 

C

 

 

 

 

D

 

 

 

 

E.

import sys
from PySide6.QtWidgets import QApplication, QWidget

from ui_form import Ui_Widget

class Widget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Widget()
        self.ui.setupUi(self)

        # [버튼을 체크 가능한(toggle) 상태로 설정]
        #  - 기본 버튼은 클릭 시 True/False 값을 전달하지 않음
        #  - setCheckable(True)를 설정하면 버튼을 누를 때마다
        #    체크됨(True) ↔ 체크 해제(False) 상태로 변경
        #  - clicked(bool) 시그널이 bool 값을 슬롯에 전달하게 됨
        self.ui.pushButton.setCheckable(True)
        
        # [✓] 클래스 내부 메서드는 self로 연결해야 함
        self.ui.pushButton.clicked.connect(self.button_clicked)

    # [✓] 클래스 내부에서 호출될 슬롯은 self 인자를 가져야 함
    def button_clicked(self, data):
        print("버튼을 클릭하셨네요!", data)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec())