0. 학습 목표

더보기

이번 단계에서는 Signal / Slot 구조에서 값(Data)이 전달되는 방식을 이해합니다.

 

이전 단계에서는 버튼을 클릭했을 때 clicked Signal이 발생하고, connect()로 연결된 Slot 함수가 실행되는 구조를 살펴보았습니다.

이번 단계에서는 한 단계 더 나아가, Signal이 단순히 함수만 실행하는 것이 아니라 값을 함께 전달할 수 있다는 점을 학습합니다.

 

예제에서는 QPushButton을 체크 가능한 버튼으로 바꾸고, 버튼의 현재 체크 상태가 Slot 함수로 전달되는 흐름을 확인합니다.

학습 목표 내용
값 전달 구조 이해 Signal이 발생할 때 값(Data)을 Slot 함수에게 전달할 수 있음을 이해합니다.
clicked(bool) Signal 이해 QPushButton의 clicked Signal이 bool 값을 전달할 수 있음을 이해합니다.
Slot 함수의 매개변수 이해 Signal이 전달한 값이 Slot 함수의 매개변수로 자동 전달되는 구조를 이해합니다.
setCheckable(True) 이해 일반 버튼을 체크 / 체크 해제가 가능한 토글 버튼으로 변경합니다.
값 전달 이벤트 처리 구현 PySide6에서 Signal이 전달한 값을 Slot 함수에서 받아 출력합니다.

이번 단계의 핵심
버튼을 클릭하면 clicked(bool) Signal이 발생하고, 현재 체크 상태 True / False 값이 Slot 함수의 매개변수로 자동 전달됩니다.

1. Signal / Slot 개념 이해하기

더보기

1.1 QPushButton의 clicked Signal 구조

이번 예제에서도 QPushButton을 사용합니다.

다만 이전 예제와 달리, 버튼을 단순히 클릭하는 것에서 끝나지 않고 버튼의 현재 상태 값을 Slot 함수로 전달합니다.

 

QPushButton의 clicked Signal은 다음과 같은 형태로 이해할 수 있습니다.

clicked(bool)

버튼이 클릭되었다는 Signal
        +
현재 버튼의 체크 상태 True / False 값 전달

여기서 bool 값은 버튼이 체크 가능한 상태일 때 더 의미 있게 사용됩니다.

버튼을 체크 가능한 상태로 만들면, 클릭할 때마다 버튼의 상태가 True ↔ False로 바뀝니다.

 

 

1.2 Signal

Signal은 어떤 일이 발생했다는 것을 알려주는 신호입니다.

이전 단계에서는 Signal을 단순히 버튼이 클릭되었다는 알림 정도로 이해했습니다.

 

하지만 일부 Signal은 이벤트가 발생했다는 사실뿐만 아니라, 관련된 값도 함께 전달할 수 있습니다.

QPushButton의 clicked Signal은 버튼의 체크 상태를 bool 값으로 전달할 수 있습니다.

구분 설명
Signal 어떤 일이 발생했음을 알려주는 신호입니다.
clicked(bool) 버튼이 클릭되었을 때 bool 값을 함께 전달할 수 있는 Signal입니다.
True 버튼이 체크된 상태입니다.
False 버튼이 체크 해제된 상태입니다.

주의할 점
일반 버튼도 clicked Signal을 가지고 있지만, 체크 상태를 의미 있게 사용하려면 버튼을 setCheckable(True)로 설정해야 합니다.

 

 

1.3 Slot

Slot은 Signal이 발생했을 때 실행되는 함수입니다.

이번 예제에서는 Signal이 전달하는 bool 값을 Slot 함수가 매개변수로 받습니다.

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

여기서 data는 clicked(bool) Signal이 전달한 True / False 값을 받는 매개변수입니다.

즉, 개발자가 직접 data 값을 넣어 주는 것이 아니라, Signal이 발생할 때 Qt가 Slot 함수에 자동으로 전달합니다.

 

 

1.4 connect()

connect()는 Signal과 Slot을 연결하는 메서드입니다.

button.clicked.connect(button_clicked)

 

위 코드는 다음과 같은 의미입니다.

button의 clicked(bool) Signal이 발생하면
        ↓
현재 체크 상태 True / False 값이 전달되고
        ↓
button_clicked(data) 함수가 자동으로 실행된다
개념 설명
Signal 이벤트 발생을 알리는 신호입니다. 예: clicked(bool)
Slot Signal을 받았을 때 실행되는 함수입니다.
data Signal이 전달한 True / False 값을 받는 매개변수입니다.
connect() Signal과 Slot을 연결하고, Signal의 값을 Slot으로 전달하는 구조를 만듭니다.

2. 예제 코드

더보기

2.1 실습 준비

이번 예제는 PyCharm에서 진행합니다.

새 Python 프로젝트를 만들고, 프로젝트 가상환경에 PySide6가 설치되어 있는 상태에서 진행합니다.

예제 파일명은 main.py로 작성합니다.

 

2. PyCharm 프로젝트 생성

 

2. PyCharm 프로젝트 생성

1. 일반 프로젝트 생성하기더보기 2. 커스텀 가상환경으로 프로젝트 시작하기 더보기 PyCharm에서 Custom environment를 선택하는 이유 기본 Project venv를 그대로 사용하지 않고, Virtualenv, Conda, Poetry, uv 같

basiclike.tistory.com

 

 

2.2 main.py 예제 코드

import sys
from PySide6.QtWidgets import QApplication, QPushButton

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

app = QApplication(sys.argv)

button = QPushButton("버튼을 클릭하세요")

button.setCheckable(True)

button.clicked.connect(button_clicked)

button.show()

sys.exit(app.exec())

이 코드를 실행하면 화면에 버튼을 클릭하세요 버튼이 나타납니다.

 

버튼을 클릭할 때마다 버튼의 체크 상태가 바뀌고, PyCharm 실행창에 현재 상태가 출력됩니다.

버튼을 클릭하셨네요! 현재 체크 상태 : True
버튼을 클릭하셨네요! 현재 체크 상태 : False
버튼을 클릭하셨네요! 현재 체크 상태 : True

 

 

2.3 예제에서 확인할 핵심 구조

코드 의미
setCheckable(True) 버튼을 체크 / 체크 해제가 가능한 토글 버튼으로 변경합니다.
clicked(bool) 버튼 클릭 시 현재 체크 상태를 bool 값으로 전달할 수 있는 Signal입니다.
button_clicked(data) Signal이 전달한 True / False 값을 data 매개변수로 받는 Slot 함수입니다.
connect() Signal과 Slot을 연결하고, Signal이 전달한 값을 Slot 함수로 전달합니다.

 

 

2.4 예제 파일

예제 파일은 main.py로 저장합니다.

main.py
0.00MB

3. 코드 분석

더보기

3.1 주석 포함 전체 코드

import sys                                      # [1] 파이썬 인터프리터 관련 기능을 제공하는 sys 모듈을 가져옴
from PySide6.QtWidgets import (                 # [2] PySide6의 위젯 관련 클래스들 중에서
    QApplication,                               #     - QApplication: 전체 어플리케이션(프로그램)을 관리하는 클래스
    QPushButton                                 #     - QPushButton: 화면에 보이는 버튼 위젯 클래스
)

                                                # [3] clicked(bool) Signal에서 전달된 값을 받을 Slot 함수 정의
                                                #     - data 매개변수는 Signal이 전달하는 True / False 값을 받음
                                                #     - 버튼이 체크되면 True, 체크 해제되면 False가 전달됨
def button_clicked(data):
    print("버튼을 클릭하셨네요! 현재 체크 상태 :", data)  # [4] 버튼 클릭 시 현재 체크 상태 출력


app = QApplication(sys.argv)                    # [5] QApplication 객체 생성
                                                #     - 모든 Qt GUI 프로그램은 QApplication 객체가 필요함
                                                #     - sys.argv: 실행 시 명령줄 인자 리스트
                                                #       (예: python main.py arg1 arg2 ...)
                                                #     - 일부 Qt/PySide 옵션을 명령줄에서 받을 수 있기 때문에
                                                #       관례적으로 sys.argv를 넣어 줌

button = QPushButton("버튼을 클릭하세요")         # [6] 버튼 위젯 객체 생성
                                                #     - "버튼을 클릭하세요"는 버튼 위에 표시될 텍스트

button.setCheckable(True)                       # [7] 버튼을 체크 가능한 상태로 변경
                                                #     - 기본 버튼은 클릭 후 다시 원래 상태로 돌아감
                                                #     - setCheckable(True)를 적용하면
                                                #       클릭할 때마다 체크 / 체크 해제 상태가 바뀜
                                                #     - 버튼의 상태가 True / False 값으로 표현됨

button.clicked.connect(button_clicked)          # [8] Signal과 Slot 연결
                                                #     - button.clicked:
                                                #       * 버튼이 클릭되었을 때 발생하는 Signal
                                                #       * 현재 체크 상태 bool 값을 함께 전달할 수 있음
                                                #     - connect(button_clicked):
                                                #       * clicked Signal이 발생하면
                                                #         button_clicked 함수가 실행되도록 연결
                                                #     - Signal이 전달한 bool 값은
                                                #       button_clicked(data)의 data로 자동 전달됨

button.show()                                   # [9] 버튼을 실제로 화면에 보이도록 함
                                                #     - show()를 호출해야 화면에 나타남
                                                #     - 호출하지 않으면 프로그램은 실행되지만 버튼이 보이지 않음

sys.exit(app.exec())                            # [10] 이벤트 루프(Event Loop) 시작
                                                #      - app.exec():
                                                #        * 마우스 클릭, 키보드 입력, 창 닫기 등
                                                #          각종 이벤트를 계속해서 처리하는 루프
                                                #        * 사용자가 창을 닫으면 이 함수가 종료되면서
                                                #          종료 코드를 int 값으로 반환
                                                #      - sys.exit(...):
                                                #        * 반환된 종료 코드를 운영체제에 전달하며
                                                #          프로그램을 깔끔하게 종료

 

 

3.2 단계별 분석

1단계: 라이브러리 가져오기

import sys
from PySide6.QtWidgets import QApplication, QPushButton

PySide6 GUI 프로그램을 만들기 위해 필요한 클래스를 가져옵니다.

이름 역할
sys 프로그램 실행 인자와 종료 처리를 위해 사용합니다.
QApplication Qt 애플리케이션 실행 환경을 만듭니다.
QPushButton 화면에 표시할 버튼 위젯을 만듭니다.

 

2단계: Slot 함수 정의

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

이 함수는 버튼이 클릭되었을 때 실행될 Slot 함수입니다.

이번 예제의 중요한 점은 Slot 함수에 data라는 매개변수가 있다는 것입니다.

 

clicked(bool) Signal이 발생하면 True / False 값이 자동으로 data에 전달됩니다.

전달 값 의미
True 버튼이 체크된 상태입니다.
False 버튼이 체크 해제된 상태입니다.

주의할 점
Signal이 값을 전달하는 경우, Slot 함수는 그 값을 받을 수 있도록 매개변수를 준비해야 합니다.

 

3단계: QApplication 생성

app = QApplication(sys.argv)

모든 Qt GUI 프로그램은 QApplication 객체가 필요합니다.

QApplication은 GUI 프로그램 전체의 실행 환경을 관리합니다.

특히 마우스 클릭, 키보드 입력, 창 닫기 같은 사용자 입력을 처리하는 이벤트 루프와 관련이 있습니다.

 

4단계: 버튼 생성

button = QPushButton("버튼을 클릭하세요")

QPushButton 객체를 생성합니다.

"버튼을 클릭하세요"는 버튼 위에 표시될 텍스트입니다.

 

5단계: 버튼을 Checkable 상태로 변경

button.setCheckable(True)

setCheckable(True)는 버튼을 체크 가능한 상태로 변경합니다.

이 설정을 적용하면 버튼은 일반 버튼이 아니라 토글 버튼처럼 동작합니다.

첫 번째 클릭
    ↓
체크됨 True

두 번째 클릭
    ↓
체크 해제 False

세 번째 클릭
    ↓
다시 체크됨 True

즉, 버튼을 클릭할 때마다 버튼의 상태가 True와 False로 번갈아 바뀝니다.

 

6단계: Signal과 Slot 연결

button.clicked.connect(button_clicked)

이 코드가 이번 예제의 핵심입니다.

사용자가 버튼 클릭
        ↓
clicked(bool) Signal 발생
        ↓
현재 체크 상태 True / False 값 전달
        ↓
button_clicked(data) 함수 실행

즉, 사용자가 버튼을 클릭하면 clicked Signal이 발생하고, 버튼의 현재 체크 상태가 data 매개변수로 자동 전달됩니다.

 

7단계: 버튼 화면에 표시

button.show()

생성한 버튼을 화면에 표시합니다.

위젯을 생성했다고 해서 자동으로 화면에 나타나는 것은 아닙니다.

화면에 표시하려면 show()를 호출해야 합니다.

 

8단계: 앱 실행

sys.exit(app.exec())

app.exec()는 Qt 이벤트 루프를 시작합니다.

이벤트 루프가 실행되어야 GUI 창이 유지되고, 사용자의 클릭이나 키보드 입력을 처리할 수 있습니다.

 

app.exec()
print("여기는 앱이 닫힌 뒤에 실행됨")

app.exec()은 GUI 창이 열려 있는 동안 계속 실행됩니다.

따라서 위 예시에서 print() 문장은 GUI 창을 닫은 뒤에 실행됩니다.

4. Qt Designer에서 구현할 때의 구조

더보기

4.1 코드 방식과 Designer 방식의 차이

앞의 예제에서는 Python 코드에서 직접 버튼을 만들고, 버튼을 체크 가능한 상태로 변경했습니다.

button = QPushButton("버튼을 클릭하세요")
button.setCheckable(True)
button.clicked.connect(button_clicked)

Qt Designer를 사용하는 경우에는 버튼을 Designer 화면에서 배치한 뒤, Python 코드에서 해당 버튼에 접근합니다.

Designer에서 만든 버튼은 보통 다음과 같은 형태로 사용합니다.

self.ui.pushButton

따라서 Qt Designer 방식에서는 다음과 같이 작성합니다.

self.ui.pushButton.setCheckable(True)
self.ui.pushButton.clicked.connect(self.button_clicked)

 

 

4.2 Qt Designer 기반 작업 흐름

Qt for Python 프로젝트 생성
        ↓
Qt Designer에서 Push Button 배치
        ↓
form.ui 파일 저장
        ↓
form.ui 파일을 ui_form.py로 변환
        ↓
Widget 클래스에서 self.ui.pushButton 접근
        ↓
self.ui.pushButton.setCheckable(True)
        ↓
self.ui.pushButton.clicked.connect(self.button_clicked)

구조는 코드 방식과 같습니다.

차이점은 버튼을 직접 생성하지 않고, Designer에서 만든 버튼을 self.ui.pushButton으로 가져와 사용한다는 점입니다.

구분 코드 방식 Qt Designer 방식
버튼 접근 button self.ui.pushButton
Checkable 설정 button.setCheckable(True) self.ui.pushButton.setCheckable(True)
Signal / Slot 연결 button.clicked.connect(button_clicked) self.ui.pushButton.clicked.connect(self.button_clicked)
Slot 함수 button_clicked(data) button_clicked(self, data)

 

 

4.3 GUI Designer 작업 

Qt Designer에서 Push Button을 배치합니다.

버튼의 objectName은 예제 기준으로 pushButton이라고 가정합니다.

 

 

 

4.4 form.ui를 ui_form.py로 변환하기

Qt Designer에서 만든 form.ui 파일은 그대로 Python 코드에서 사용할 수 없습니다.

일반적으로 다음 명령으로 form.ui → ui_form.py 파일로 변환합니다.

pyside6-uic form.ui -o ui_form.py

변환이 끝나면 ui_form.py 파일이 생성됩니다.

이 파일 안에는 Designer에서 배치한 버튼, 라벨, 입력창 같은 위젯 정보가 Python 코드로 들어 있습니다.

 

 

4.5 ui_form.py 파일 적용하기

Qt Designer 방식에서는 화면 구성을 담당하는 ui_form.py를 가져온 뒤,

Widget 클래스 안에서 버튼을 체크 가능한 상태로 설정하고 Signal과 Slot을 연결합니다.

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) 상태로 설정]
        #  - 기본 버튼은 클릭 후 다시 원래 상태로 돌아감
        #  - setCheckable(True)를 설정하면 버튼을 누를 때마다
        #    체크됨(True) ↔ 체크 해제(False) 상태로 변경
        #  - clicked(bool) Signal이 bool 값을 Slot에 전달할 수 있음
        self.ui.pushButton.setCheckable(True)

        # [✓] 클래스 내부 메서드는 self로 연결해야 함
        self.ui.pushButton.clicked.connect(self.button_clicked)

    # [✓] 클래스 내부에서 호출될 Slot은 self 인자를 가져야 함
    # [✓] clicked(bool) Signal이 전달하는 값은 data 매개변수로 받음
    def button_clicked(self, data):
        print("버튼을 클릭하셨네요! 현재 체크 상태 :", data)

if __name__ == "__main__":
    app = QApplication(sys.argv)

    widget = Widget()
    widget.show()

    sys.exit(app.exec())
실행 스크린샷입니다.

 

 

4.6 self와 data가 필요한 이유

Qt Designer 방식에서는 버튼이 Widget 클래스 내부에서 사용됩니다.

따라서 버튼은 self.ui.pushButton 형태로 접근하고, Slot 함수는 self.button_clicked 형태로 연결합니다.

 

또한 clicked(bool) Signal이 True / False 값을 전달하므로, Slot 메서드는 이 값을 받을 매개변수도 함께 가져야 합니다.

중요한 점
클래스 내부 메서드를 Slot으로 연결할 때는 self.button_clicked로 연결하고, Signal이 전달하는 값은 data 매개변수로 받습니다.

코드 설명
self.ui.pushButton Designer에서 배치한 버튼 위젯에 접근합니다.
setCheckable(True) 버튼을 체크 / 체크 해제 가능한 상태로 변경합니다.
self.button_clicked Widget 클래스 내부에 정의된 Slot 메서드입니다.
data clicked(bool) Signal이 전달한 True / False 값을 받습니다.

5. 정리

더보기

이번 단계에서는 QPushButton의 clicked(bool) Signal을 사용하여 Signal이 값을 전달하는 구조를 살펴보았습니다.

핵심 흐름은 다음과 같습니다.

버튼 클릭
    ↓
clicked(bool) Signal 발생
    ↓
현재 체크 상태 True / False 값 전달
    ↓
button_clicked(data) 함수 실행
    ↓
전달받은 data 값을 사용
개념 정리
clicked(bool) 버튼 클릭 시 bool 값을 함께 전달할 수 있는 Signal입니다.
setCheckable(True) 버튼을 체크 / 체크 해제 가능한 토글 버튼으로 만듭니다.
True 버튼이 체크된 상태입니다.
False 버튼이 체크 해제된 상태입니다.
Slot 함수의 매개변수 Signal이 전달한 값을 자동으로 받습니다.

이번 단계에서 기억할 문장
Qt의 Signal은 Slot 함수를 실행할 뿐만 아니라, 필요한 값을 함께 전달할 수 있습니다.

 

clicked(bool) Signal은 버튼의 현재 체크 상태를 True / False 값으로 Slot 함수에 전달합니다.

참고. 공식 문서로 확인하기

더보기

이번 예제에서 사용한 QPushButton, clicked(bool), connect(), setCheckable(True)는 모두 Qt / PySide6 공식 문서에서 확인할 수 있습니다.

 

특히 이번 단계에서 중요한 부분은 clicked Signal이 Slot 함수를 실행할 뿐만 아니라, bool 값을 함께 전달할 수 있다는 점입니다.

 

1. 공식 문서 참고 표

구분 공식 문서 확인할 내용
Signal / Slot 기본 개념 Qt for Python - Signals and Slots Signal, Slot, connect()의 기본 구조와 button.clicked.connect(...) 사용 예제를 확인할 수 있습니다.
Qt Signal / Slot 개념 Qt 6 - Signals & Slots Signal은 특정 이벤트가 발생했을 때 emit되고, Slot은 Signal에 반응하여 호출되는 함수라는 개념을 확인할 수 있습니다.
QPushButton PySide6.QtWidgets.QPushButton PySide6에서 QPushButton 클래스의 기본 역할과 버튼 위젯 문서를 확인할 수 있습니다.
clicked(bool) PySide6.QtWidgets.QAbstractButton clicked([checked=false]) Signal과 checked 매개변수가 bool 타입이라는 내용을 확인할 수 있습니다.
setCheckable(True) PySide6.QtWidgets.QAbstractButton setCheckable()이 버튼을 토글 가능한 버튼으로 설정한다는 내용을 확인할 수 있습니다.

 

2. Signal / Slot 기본 개념

Qt에서는 사용자가 버튼을 클릭하거나, 입력창의 값이 바뀌거나, 창을 닫는 것처럼 어떤 이벤트가 발생했을 때 이를 Signal로 알립니다.

그리고 그 Signal에 연결되어 실행되는 함수를 Slot이라고 이해할 수 있습니다.

PySide6 공식 문서에서는 버튼의 clicked Signal을 함수에 연결하는 기본 구조를 다음과 같이 확인할 수 있습니다.

button.clicked.connect(function)

즉, 버튼에서 clicked Signal이 발생하면, connect()로 연결된 함수가 자동으로 실행됩니다.

 

3. QPushButton과 clicked(bool)

QPushButton은 PySide6에서 버튼을 만들 때 사용하는 대표적인 위젯입니다.

QPushButton은 버튼 계열 위젯이므로, clicked, pressed, released, toggled 같은 버튼 관련 Signal은 QAbstractButton 문서에서 함께 확인하는 것이 좋습니다.

QAbstractButton 문서에서는 clicked Signal을 다음과 같은 형태로 설명합니다.

clicked([checked=false])

Parameters:
checked – bool

따라서 Slot 함수를 다음과 같이 작성하면,

def button_clicked(checked):
    print(checked)

버튼의 현재 체크 상태가 checked 매개변수로 자동 전달됩니다.

 

4. setCheckable(True)의 의미

일반적인 QPushButton은 클릭하면 눌렸다가 다시 원래 상태로 돌아오는 버튼입니다.

하지만 setCheckable(True)를 사용하면 버튼을 체크 가능한 버튼, 즉 토글 버튼처럼 사용할 수 있습니다.

button.setCheckable(True)

이 상태에서 버튼을 클릭하면 버튼은 체크 상태와 체크 해제 상태를 오가게 됩니다.

버튼 상태 전달되는 값
체크됨 True
체크 해제됨 False

즉, QPushButton에 setCheckable(True)를 적용하면 버튼 클릭 시 현재 체크 상태가 True 또는 False 값으로 Slot 함수에 전달될 수 있습니다.

 

5. 이번 예제와 공식 문서 연결

학습 내용 관련 공식 문서 확인할 내용
Signal / Slot 구조 Qt for Python - Signals and Slots button.clicked.connect(function) 구조
QPushButton PySide6.QtWidgets.QPushButton 버튼 위젯 클래스의 기본 문서
clicked(bool) PySide6.QtWidgets.QAbstractButton clicked([checked=false]), checked – bool
setCheckable(True) PySide6.QtWidgets.QAbstractButton 버튼을 토글 가능한 버튼으로 설정하는 기능

 

정리

이번 단계에서 사용하는 구조는 공식 문서 기준으로 다음과 같이 연결됩니다.

QPushButton
    ↓ setCheckable(True)
체크 가능한 버튼
    ↓ 클릭
clicked(bool)
    ↓ connect()
Slot 함수의 checked 매개변수
    ↓
True / False 값 출력

즉, 버튼을 클릭하면 clicked(bool) Signal이 발생하고, 현재 체크 상태인 True 또는 False 값이 Slot 함수의 매개변수로 자동 전달됩니다.