주제: [PyQt 프로그래밍] 파이썬으로 GUI 만들기 [2] pyqt 시그널과 슬롯 이해하기
작성: 2023-10-16
버전: python 3.9 / PyQt6 6.5.2
PyQt는 강력한 Qt C++ 크로스 플랫폼 프레임워크와 유연한 Python 프로그래밍 언어를
원활하게 통합하는 브리지로서, 주로 강력한 GUI 모듈 역할을 합니다.
시그널, 슬롯 그리고 커넥션...?
PyQt에 많은 경험은 없지만, 최근 간단한 GUI 표출하면서 사용을 해봤습니다.사실 Qt에 대한 이해없이 기능구현 실습위주로 진행하다보니 Qt의 기본적인 작동개념조차 모르고 있었습니다. 그러다 우연히 직장동료분을 통해서 코드점검 받다가, "시그널과 슬롯은 뭐로 지정한거야?" 라는 질문에 '시..시그널? 슬롯? 그게 뭐지...?' 하면서 해당 포스팅을 준비하게 되었습니다.
Qt 이벤트 처리 및 통신 메커니즘
PyQt를 사용하려면, Qt의 핵심개념인 시그널(Signal)과 슬롯(Slot)의 이해가 필요합니다. 시그널(Signal)과 슬롯(Slot)은 이벤트 처리 및 통신 메커니즘을 제공하는 핵심 개념으로, 시그널은 어떤 이벤트나 상태 변경을 나타내며, 슬롯은 시그널을 처리하는 함수나 메서드입니다.정의만 보면 되게 어렵게 느껴지만, 매우 간단한 개념입니다.
예를들어, 아래의 그림처럼 체크박스가 있다고 가정해봅시다.
사용자가 특정 체크박스를 클릭 했을 때, 클릭한 상태를 파악하는 것이 '시그널' 입니다.
이러한 변화에 따라 체크된 데이터를 테이블 또는 지도로 표출하는 일을 처리하는 함수가 '슬롯'입니다.
그리고 이 '시그널'과 '슬롯'을 연결하는 것이 '연결(connect)' 입니다.
정리하면 다음과 같습니다
시그널(Signal)
객체에서 발생하는 이벤트나 상태변경
슬롯(Slot)
슬롯은 시그널을 처리하는 함수나 메서드
연결(Connect)
시그널과 슬롯은 connect 메서드를 사용하여 연결
이를 통해 시그널이 발생하면 연결된 슬롯 호출
PyQt Window창 생성하기
필자의 경우 PyQt6을 사용했습니다. PyQt5 유저는 해당 코드를 그래도 사용하는 경우, 구동이 되지않는 점 참고하시기를 바랍니다.기초예제부터 다뤄보도록 하겠습니다.
(구현) 하나의 윈도우 창을 생성하고, 해당 창의 이름을 "윈도우 제목창"으로 명명하는 어플리케이션 만들기
import sys
from PyQt6.QtWidgets import (QApplication, QMainWindow)
class MainApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 기본구성
self.setWindowTitle("윈도우 제목창")
self.setGeometry(200, 200, 250, 150) # (A,B,C,D)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainApp()
sys.exit(app.exec())
(1) 필요한 모듈 가져오기
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
- sys: 시스템과 관련된 기능을 사용하기 위한 모듈
- QApplication: PyQt6 애플리케이션을 생성하기 위한 클래스
- QMainWindow: 메인 창을 생성하기 위한 클래스
(2) MainApp 클래스 정의
class MainApp(QMainWindow):
- MainApp 클래스는 QMainWindow 클래스를 상속
- MainApp 클래스의 생성자(__init__)를 정의
def __init__(self):
super().__init__()
self.initUI()
- super().__init__()를 호출하여 부모 클래스인 QMainWindow의 생성자 호출
- self.initUI()를 호출하여 초기 사용자 인터페이스를 설정하는 메서드 호출
(3) initUI 메서드 정의
def initUI(self):
self.setWindowTitle("윈도우 제목창")
self.setGeometry(200, 200, 250, 150)
self.show()
- self.setWindowTitle("윈도우 제목창"): 윈도우의 제목 설정
- self.setGeometry(A, B, C, D): 윈도우의 위치와 크기 설정 (단위: px (픽셀))
- (A, B)는 윈도우의 좌측 상단 모서리을 기준으로 위치
- (C, D)는 생성하는 윈도우 창의 너비와 높이
- self.resize(500, 700): 화면의 재설정 가능
- self.show(): 윈도우를 화면에 표시
(4) 메인코드 정의
if __name__ == '__main__':
app = QApplication(sys.argv) # PyQt6 애플리케이션 객체 생성
window = MainApp() # MainApp 클래스의 인스턴스 생성
sys.exit(app.exec())
- if __name__ == '__main__': 이 부분은 스크립트가 직접 실행될 때만 코드 블록을 실행하도록 하는 일반적인 Python 스크립트
- app = QApplication(sys.argv): PyQt6 애플리케이션 객체 생성
- window = MainApp(): MainApp 클래스의 인스턴스 생성
- sys.exit(app.exec()): 애플리케이션을 실행하고, 이벤트 루프를 시작합니다. 애플리케이션이 종료될 때까지 대기
시그널, 슬롯 그리고 커넥션 이해하기
위에서 설명한 시그널, 슬롯, 그리고 커넥션 적용을 위해 방금 만든 코드에서 추가하도록 하겠습니다.
(구현) QPushButton 위젯을 생성하여 이 버튼의 clicked 시그널을 onButtonClicked 슬롯에 연결
버튼이 클릭되면 onButtonClicked 메서드가 호출되어 상태 표시줄에 메시지가 표시
import sys
from PyQt6.QtWidgets import (QApplication, QMainWindow, QPushButton)
class MainApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("윈도우 제목창")
self.setGeometry(200, 200, 250, 150)
################ 추가된 부분 ################
button = QPushButton('클릭하세요', self)
button.setGeometry(75,60, 100, 30)
# 시그널과 슬롯 연결
button.clicked.connect(self.onButtonClicked)
# 버튼이 클릭되었을 때 호출되는 함수(슬롯)
def onButtonClicked(self):
self.statusBar().showMessage('버튼이 클릭되었습니다.')
################ 추가된 부분 ################
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainApp()
window.show()
sys.exit(app.exec())
Reference
- PyQt button 관련 문서 : https://pythonpyqt.com/pyqt-button
- PyQt계산기 만들기 예시: https://pythonpyqt.com/pyqt-grid-layout/
'Python > 3️⃣ 프로그래밍' 카테고리의 다른 글
[PyQt6] QListWidget 활용한 GUI 구현[1/2] (코드 포함) (0) | 2023.10.25 |
---|---|
[PyQt6] 기본적인 구조부터 이해하기 (3) | 2023.10.24 |
QtWidegets 모듈 vs QtWidegets 클래스 (0) | 2023.10.23 |
PyQt5와 PyQt6의 주요 변경사항(표) (0) | 2023.10.23 |
PyQt6 소개 및 설치하기 (0) | 2023.10.09 |