|
시그널은 특정 이벤트가 발생했음을 알리는 메커니즘입니다. UI 요소에서 발생하는 이벤트(예: 버튼 클릭, 텍스트 변경 등)가 있을 때, 이 이벤트를 다른 객체에 알리기 위해 시그널을 사용합니다. 시그널은 어떤 행동이 발생했다는 정보를 전달할 뿐, 자체적으로 어떤 동작을 수행하지는 않습니다.
내장 시그널: PySide6에서 제공하는 대부분의 위젯에는 미리 정의된 내장 시그널이 있습니다. 예를 들어, QPushButton은 clicked라는 시그널을 가지고 있습니다. 이 시그널은 사용자가 버튼을 클릭할 때 발생합니다.
커스텀 시그널: 필요에 따라 사용자가 직접 시그널을 정의할 수도 있습니다. 이를 통해 UI 요소뿐 아니라, 사용자 정의 클래스에서도 시그널을 생성하고 사용할 수 있습니다.
2. Slot (슬롯)
슬롯은 시그널이 발생했을 때 호출되는 함수 또는 메서드입니다. 시그널은 특정 슬롯에 연결(connect)되며, 시그널이 발생하면 연결된 슬롯이 호출됩니다. 슬롯은 시그널에 의해 호출되기 때문에 이벤트 핸들러의 역할을 합니다.
슬롯은 일반 함수일 수도 있고, 클래스의 메서드일 수도 있습니다. 슬롯은 시그널과 연결되면, 시그널이 발생할 때마다 호출됩니다.
3. Signal-Slot 연결
시그널과 슬롯을 연결하려면 connect() 메서드를 사용합니다. 이 메서드를 통해 특정 시그널을 특정 슬롯에 연결할 수 있습니다. 연결된 슬롯은 시그널이 발생할 때 자동으로 호출됩니다.
# 시그널과 슬롯을 연결하는 기본 형태
signal.connect(slot)
예시 1: 내장 시그널과 슬롯 사용
from PySide6.QtWidgets import QApplication, QPushButton
# 슬롯 함수 정의
def on_button_clicked():
print("Button clicked!")
app = QApplication([])
# 버튼 생성
button = QPushButton("Click me")
button.clicked.connect(on_button_clicked) # clicked 시그널을 슬롯에 연결
button.show()
app.exec()
이 코드에서 button.clicked는 QPushButton 클래스의 내장 시그널입니다. 사용자가 버튼을 클릭하면 on_button_clicked 슬롯이 호출됩니다.
예시 2: 커스텀 시그널과 슬롯 정의
PySide6에서 커스텀 시그널을 정의하고 사용하는 방법입니다. 이를 위해 Signal 클래스를 사용합니다.
from PySide6.QtCore import Signal, QObject
# 커스텀 객체 정의
class MyObject(QObject):
# 커스텀 시그널 정의
my_signal = Signal()
def __init__(self):
super().__init__()
# 시그널을 발생시키는 메서드
def trigger_signal(self):
print("Signal emitted!")
self.my_signal.emit() # 시그널을 발생시킴
# 슬롯 함수 정의
def my_slot():
print("Signal received!")
# 객체 생성
obj = MyObject()
# 시그널과 슬롯을 연결
obj.my_signal.connect(my_slot)
# 시그널 발생
obj.trigger_signal()
이 코드에서 MyObject 클래스는 my_signal이라는 커스텀 시그널을 정의하고, trigger_signal 메서드를 통해 이 시그널을 발생시킵니다. 시그널이 발생하면, 연결된 슬롯인 my_slot 함수가 호출됩니다.