반응형
지난 포스팅
2022.11.21 - [기타/PyQt5 한꼬집씩만 따라해보기] - 5. 메인윈도우의 초기사이즈 정하기
이번 포스팅에서는 : 시그널-슬롯 기초
내가 그의 이름을 불러주기 전에는
그는 다만
하나의 몸짓에 지나지 않았다.
내가 그의 이름을 불러주었을 때,
그는 나에게로 와서
꽃이 되었다.
내가 그의 이름을 불러준 것처럼
나의 이 빛깔과 향기에 알맞는
누가 나의 이름을 불러다오.
그에게로 가서 나도
그의 꽃이 되고 싶다.
우리들은 모두
무엇이 되고 싶다.
너는 나에게 나는 너에게
잊혀지지 않는 하나의 눈짓이 되고 싶다.
<김춘수 - 꽃>
시그널과 슬롯은 Qt GUI 에서 발생하는 이벤트를 다루는 재미있는 개념으로,
제 블로그의 다른 튜토리얼, "PySide6 입문과정"에서도 다룬 적이 있습니다.
2021.03.25 - [기타/PySide6 # Qt의 원조가 돌아왔다!] - 1. PySide6의 Signal과 Slot에 관하여
시그널-슬롯 개념은 콜백과는 미묘하게 차이가 있는 것 같습니다.
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의 대표적인 위젯들에 대해 하나씩 다뤄보겠습니다.
다음 포스팅
작성중
반응형
'GUI 튜토리얼 > PyQt5 한꼬집씩만 따라해보기' 카테고리의 다른 글
7. 윈도우에 레이블을 붙여봅시다. #QLabel (0) | 2022.11.22 |
---|---|
5. 메인윈도우의 초기사이즈 정하기 (0) | 2022.11.21 |
4. QMainWindow에 위젯을 넣어봅시다. (0) | 2022.11.21 |
댓글