PyQt개발강좌, 커스텀 시그널 및 슬롯 생성

PyQt는 Python에서 Qt 라이브러리를 사용하여 GUI 애플리케이션을 구축할 수 있게 해주는 강력한 도구입니다. PyQt를 사용하면 사용자 인터페이스를 직관적으로 디자인할 수 있을 뿐만 아니라, 다양한 기능을 쉽게 추가할 수 있습니다. 이 강좌에서는 PyQt의 기본 구성 요소인 시그널과 슬롯에 대해 알아보고, 커스텀 시그널과 슬롯을 생성하는 방법을 단계적으로 설명하겠습니다.

1. 시그널과 슬롯의 이해

시그널과 슬롯은 PyQt의 핵심 개념입니다. 시그널은 특정 사건이 발생했음을 알리는 메시지입니다. 슬롯은 이러한 시그널에 대응하는 메서드로, 시그널이 방출되었을 때 호출되어야 할 동작을 정의합니다. 예를 들어, 버튼 클릭 시그널을 방출하면, 해당 시그널에 연결된 슬롯이 호출되어 어떤 작업을 수행하는 방식입니다.

1.1 기본 시그널과 슬롯 사용 예

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('시그널과 슬롯 예제')
        self.setGeometry(100, 100, 300, 200)

        button = QPushButton('클릭하세요', self)
        button.clicked.connect(self.on_click)

        layout = QVBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

    def on_click(self):
        print('버튼이 클릭되었습니다!')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

위 예제는 기본적인 PyQt 애플리케이션을 구현한 것으로, 버튼을 클릭하면 콘솔에 메시지를 출력합니다. 버튼 클릭 이벤트는 기본적인 시그널과 슬롯 메커니즘을 보여줍니다.

2. 커스텀 시그널과 슬롯 생성

이제 커스텀 시그널과 슬롯을 생성하는 방법에 대해 알아보겠습니다. PyQt에서는 사용자 정의 시그널을 만들 수 있어, 필요에 따라 다양한 이벤트를 처리할 수 있습니다.

2.1 커스텀 시그널 정의하기

커스텀 시그널은 pyqtSignal 클래스를 사용하여 정의합니다. 다음 예제를 통해 커스텀 시그널을 만드는 방법을 알아보겠습니다.

from PyQt5.QtCore import pyqtSignal, QObject

class Communicate(QObject):
    # 커스텀 시그널 정의
    custom_signal = pyqtSignal(str)

    def emit_signal(self):
        self.custom_signal.emit("이것은 커스텀 시그널입니다.")

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.comm = Communicate()
        self.comm.custom_signal.connect(self.on_custom_signal)

    def initUI(self):
        self.setWindowTitle('커스텀 시그널 예제')
        self.setGeometry(100, 100, 300, 200)

        button = QPushButton('시그널 방출', self)
        button.clicked.connect(self.comm.emit_signal)

        layout = QVBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

    def on_custom_signal(self, message):
        print(message)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

위 예제에서는 Communicate 클래스를 생성하고, 이 클래스에서 커스텀 시그널 custom_signal을 정의했습니다. 버튼 클릭 시 이 시그널이 방출되며, 연결된 슬로트가 호출되어 메시지가 출력됩니다.

2.2 커스텀 시그널에 매개변수 전달하기

커스텀 시그널은 매개변수를 가질 수 있습니다. 아래 예제에서는 문자열 메시지를 슬롯에 전달합니다.

class Communicate(QObject):
    custom_signal = pyqtSignal(str)

    def emit_signal(self, message):
        self.custom_signal.emit(message)

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.comm = Communicate()
        self.comm.custom_signal.connect(self.on_custom_signal)

    def initUI(self):
        self.setWindowTitle('커스텀 시그널 με 매개변수 예제')
        self.setGeometry(100, 100, 300, 200)

        button = QPushButton('시그널 방출', self)
        button.clicked.connect(lambda: self.comm.emit_signal("안녕하세요!"))

        layout = QVBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

    def on_custom_signal(self, message):
        print(message)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

이 예제에서는 버튼 클릭 시 “안녕하세요!”라는 메시지가 커스텀 시그널을 통해 슬롯으로 전달됩니다. 이처럼 커스텀 시그널은 슬롯에 데이터를 전달하는 유용한 수단입니다.

3. 시그널과 슬롯의 연결 해제

때때로 시그널과 슬롯의 연결을 해제해야 할 필요가 있습니다. 이를 통해 특정 이벤트가 더 이상 발생할 때 슬롯이 호출되지 않도록 할 수 있습니다. disconnect() 메서드를 사용하여 연결을 해제할 수 있습니다.

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.comm = Communicate()
        self.comm.custom_signal.connect(self.on_custom_signal)

    def initUI(self):
        self.setWindowTitle('시그널과 슬롯 연결 해제 예제')
        self.setGeometry(100, 100, 300, 200)

        button_emmit = QPushButton('시그널 방출', self)
        button_emmit.clicked.connect(lambda: self.comm.emit_signal("신호 방출"))

        button_disconnect = QPushButton('연결 해제', self)
        button_disconnect.clicked.connect(self.comm.custom_signal.disconnect)

        layout = QVBoxLayout()
        layout.addWidget(button_emmit)
        layout.addWidget(button_disconnect)
        self.setLayout(layout)

    def on_custom_signal(self, message):
        print(message)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

이 예제에서 두 개의 버튼이 있습니다. 하나는 커스텀 시그널을 방출하고, 다른 하나는 시그널과 슬롯의 연결을 해제합니다. 연결이 해제된 후에는 시그널이 방출되더라도 슬롯이 호출되지 않습니다.

4. 정리

이번 강좌를 통해 PyQt에서의 커스텀 시그널 및 슬롯의 생성과 활용에 대해 배웠습니다. 커스텀 시그널은 이벤트 처리의 유연성을 높여주며, 복잡한 GUI 애플리케이션에서 객체 간의 통신을 쉽게 해줍니다. 이제 여러분은 PyQt를 사용하여 더 강력한 애플리케이션을 만들 준비가 되었습니다.

5. 추가 학습 자료

여기서 소개된 예제 코드는 GUI 애플리케이션을 구현하는 기초적인 방법을 보여줍니다. 더 복잡한 애플리케이션을 개발하는 데 있어서도 시그널과 슬롯의 원리는 동일하게 적용되므로, 이를 기반으로 다양한 기능들을 추가해보시길 바랍니다.