5.6 다중 시그널/단일 슬롯
728x90

1. 단일 슬롯에 여러 시그널 연결하기
: 하나의 Slot에 여러 Signal을 연결할 수 있다.
더보기







목표
QSlider.valueChanged ───────▶ update_lcd(value)
QDial.valueChanged ───────▶ update_lcd(value)


from PySide6.QtWidgets import QDial

# [1] Slider와 동일한 역할을 할 Dial 추가
self.dial = QDial()
self.dial.setRange(1, 100)
self.dial.setValue(25)

# [1] Slider와 동일한 역할을 할 Dial 추가
self.dial = QDial()
self.dial.setRange(1, 100)
self.dial.setValue(25)

# [2] QDial 레이아웃에 추가
layout.addWidget(self.dial)

# ProgressBar 업데이트는 슬라이더/다이얼 둘 다 처리
self.dial.valueChanged.connect(self.update_progress_bar)

import sys
from PySide6.QtCore import Qt, Signal, Slot
from PySide6.QtWidgets import QApplication, QWidget, QSlider, QVBoxLayout, QLabel, QProgressBar, QLCDNumber
from PySide6.QtWidgets import QDial
class SliderExample(QWidget):
processedValueSignal = Signal(int)
def __init__(self):
super().__init__()
self.setWindowTitle("Signal & Slot 확장 예제")
self.resize(300, 150)
self.label_original = QLabel("원본 값: -")
self.label_processed = QLabel("처리된 값(×2): -")
self.slider = QSlider(Qt.Horizontal)
self.slider.setMinimum(1)
self.slider.setMaximum(100)
self.slider.setValue(25)
# [1] Slider와 동일한 역할을 할 Dial 추가
self.dial = QDial()
self.dial.setRange(1, 100)
self.dial.setValue(25)
self.progress_bar = QProgressBar()
self.progress_bar.setRange(0, 100)
self.progress_bar.setValue(25)
self.lcd_number = QLCDNumber()
self.lcd_number.setDigitCount(3)
self.lcd_number.display(50)
# ProgressBar 업데이트는 슬라이더/다이얼 둘 다 처리
self.slider.valueChanged.connect(self.respond_to_slider)
self.dial.valueChanged.connect(self.update_progress_bar)
self.processedValueSignal.connect(self.on_processed_value)
self.slider.valueChanged.connect(self.update_progress_bar)
self.processedValueSignal.connect(self.update_lcd)
layout = QVBoxLayout(self)
layout.addWidget(self.slider)
layout.addWidget(self.label_original)
layout.addWidget(self.progress_bar)
layout.addWidget(self.lcd_number)
layout.addWidget(self.label_processed)
# [2] QDial 레이아웃에 추가
layout.addWidget(self.dial)
# [3] QDial 시그널에 연결할 슬롯은 기존 시그널을 사용합니다.
@Slot(int)
def respond_to_slider(self, value):
print("slider moved to:", value)
self.label_original.setText(f"원본 값: {value}")
processed_value = value * 2
self.processedValueSignal.emit(processed_value)
@Slot(int)
def on_processed_value(self, value):
print("커스텀 시그널:", value)
self.label_processed.setText(f"처리된 값(×2): {value}")
@Slot(int)
def update_progress_bar(self, value):
self.progress_bar.setValue(value)
@Slot(int)
def update_lcd(self, value):
self.lcd_number.display(value)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = SliderExample()
window.show()
sys.exit(app.exec())
2. 슬라이더와 다이얼 연동
더보기



목표
- 슬라이더를 움직이면 → 다이얼 값도 같이 바뀌고
- 다이얼을 돌리면 → 슬라이더 값도 같이 바뀌고
- 나머지 ProgressBar, Label, LCDNumber는 한 군데에서만 처리


# 슬라이더/다이얼 서로 동기화 (상호 연동)
self.slider.valueChanged.connect(self.dial.setValue)
self.dial.valueChanged.connect(self.slider.setValue)

3. Qt 에서 구현
: 과제입니다.