본문 바로가기
GUI 튜토리얼/PyQt5 한꼬집씩만 따라해보기

6. 시그널-슬롯 맛보기

by 일코 2022. 11. 21.

지난 포스팅

2022.11.21 - [기타/PyQt5 한꼬집씩만 따라해보기] - 5. 메인윈도우의 초기사이즈 정하기

 

5. 메인윈도우의 초기사이즈 정하기

지난 포스팅 2022.11.21 - [기타/PyQt5 한꼬집씩만 따라해보기] - 4. QMainWindow에 위젯을 넣어봅시다. 4. QMainWindow에 위젯을 넣어봅시다. 지난 포스팅 2022.11.21 - [기타/PyQt5 한꼬집씩만 따라해보기] - 3. 어

martinii.fun


 

이번 포스팅에서는 : 시그널-슬롯 기초

 

내가 그의 이름을 불러주기 전에는
그는 다만
하나의 몸짓에 지나지 않았다.

내가 그의 이름을 불러주었을 때,
그는 나에게로 와서
꽃이 되었다.

내가 그의 이름을 불러준 것처럼
나의 이 빛깔과 향기에 알맞는
누가 나의 이름을 불러다오.
그에게로 가서 나도
그의 꽃이 되고 싶다.

우리들은 모두
무엇이 되고 싶다.

너는 나에게 나는 너에게
잊혀지지 않는 하나의 눈짓이 되고 싶다.

<김춘수 - 꽃>

 

시그널과 슬롯은 Qt GUI 에서 발생하는 이벤트를 다루는 재미있는 개념으로,

제 블로그의 다른 튜토리얼, "PySide6 입문과정"에서도 다룬 적이 있습니다.

2021.03.25 - [기타/PySide6 # Qt의 원조가 돌아왔다!] - 1. PySide6의 Signal과 Slot에 관하여

 

1. PySide6의 Signal과 Slot에 관하여

시그널과 슬롯 짐작컨대 이 몇 개 안 되는 튜토리얼 시리즈를 따라오시면서, 여러분이 가장 많이 하셨던 생각 중 하나는, "그래서 이 버튼이 뭔가 액션을 하게 하려면 어떻게 해야 하나?" 일 거라

martinii.fun

시그널-슬롯 개념은 콜백과는 미묘하게 차이가 있는 것 같습니다.

Qt 위젯들은 특정 이벤트가 발생하는 경우 항상 "시그널"을 외칩니다. 누가 듣든 말든~
그리고 어떤 위젯은 특정 시그널을 들었을 때  그에 반응하기로 합니다. 누가 외쳤는지는 상관없고~
한 개의 시그널에 여러 개의 슬롯을 연결할 수도 있고,
마찬가지로 여러 개의 시그널을 한 개의 슬롯에 연결할 수도 있습니다.
시그널에 다른 시그널을 붙이는 것도 가능합니다.

이처럼 시그널과 슬롯은 완전히 독립적인 컴포넌트라서,
Qt 공식문서에서는
시그널-슬롯이야말로 "진정한 정보 캡슐화(true information encapsulation)"라며 으시대는 듯 합니다.
(사실 저는 컴공맹이라 정보 캡슐화가 무슨 뜻인지 모릅니다.. 누가 설명 좀 해줬으면..)
대신 시그널-슬롯은 콜백함수를 호출하는 시간에 비하면 약 10배 정도 느리다고 합니다.

 

하여튼,

지난 포스팅까지 진행했던 "메인 윈도우 안에 푸쉬버튼" 코드를 활용하겠습니다.

전체 코드를 먼저 보여드리겠습니다.

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton


def button_was_clicked():
    print("클릭~")


app = QApplication([])
win = QMainWindow()

button = QPushButton("눌러주세요")
button.clicked.connect(button_was_clicked)
win.setCentralWidget(button)

win.show()
app.exec()

 

4번 라인에 button_was_clicked라는 함수를 하나 정의했습니다. (얘가 일종의 슬롯)

12번 라인인 button.clicked.connect(button_was_clicked)은

버튼 위젯의 clicked 시그널과 button_was_clicked 슬롯을 connect로 연결해주었습니다.

슬롯을 정의하기 전에도 button은 항상 클릭 이벤트에 pressed, clicked 및 released 시그널을 외치고 있었습니다.

 

이제 버튼을 클릭하면 파이썬 콘솔에서 "클릭~"을 출력하는지 한 번 직접 실행해봅시다.

의도한 대로 잘 실행되네요.

이 포스팅에서는 시그널-슬롯 예제라고 부르기도 애매할 만큼 간단한 예제를 들었지만

차차 여러 개의 위젯을 사용하면서 위젯간 통신에 매번 질리도록까지는 아니고 시그널-슬롯을 사용하게 될 거니까요.

너무 싱거운 예제라고 실망하지 마시기 바랍니다.

다음 포스팅부터는 PyQt5의 대표적인 위젯들에 대해 하나씩 다뤄보겠습니다.

 


다음 포스팅

작성중

댓글