728x90

1. 단일 시그널에 여러 슬롯 연결하기

: 하나의 Signal에 여러 Slot을 연결할 수 있다.

더보기

목표

QSlider.valueChanged  ───────▶  respond_to_slider(value)   # 슬라이더 원본 값 
QSlider.valueChanged  ───────▶  update_progress_bar(value) # 슬라이더 원본 값
processedValueSignal  ───────▶  on_processed_value(value)  # x2 처리된 값
processedValueSignal  ───────▶  update_lcd(value)          # x2 처리된 값

 

 

 

 

from PySide6.QtWidgets import QProgressBar, QLCDNumber

 

 

 

 

        # [1] ProgressBar, LCDNumber 추가
        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)

 

 

 

 

        # [2] ProgressBar, LCDNumber 레이아웃 추가
        layout.addWidget(self.progress_bar)
        layout.addWidget(self.lcd_number)
        layout.addWidget(self.label_processed)

 

 

 

 

    # [3] 슬라이더 값 그대로 ProgressBar에 반영
    @Slot(int)
    def update_progress_bar(self, value):
        self.progress_bar.setValue(value)

    # [4] 처리된 값(×2)을 LCD에 표시
    @Slot(int)
    def update_lcd(self, value):
        self.lcd_number.display(value)

 

 

 

 

        # [5] 사용자 정의 Signal → 여러 Slot 연결
        # ProgressBar 업데이트, LCDNumber 업데이트
        self.slider.valueChanged.connect(self.update_progress_bar)
        self.processedValueSignal.connect(self.update_lcd)

 

 

 

 

import sys
from PySide6.QtCore import Qt, Signal, Slot
from PySide6.QtWidgets import QApplication, QWidget, QSlider, QVBoxLayout, QLabel
from PySide6.QtWidgets import QProgressBar, QLCDNumber

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] ProgressBar, LCDNumber 추가
        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)

        self.slider.valueChanged.connect(self.respond_to_slider)
        self.processedValueSignal.connect(self.on_processed_value)
        # [5] 사용자 정의 Signal → 여러 Slot 연결
        # ProgressBar 업데이트, LCDNumber 업데이트
        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)
        # [2] ProgressBar, LCDNumber 레이아웃 추가
        layout.addWidget(self.progress_bar)
        layout.addWidget(self.lcd_number)
        layout.addWidget(self.label_processed)

    @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}")

    # [3] 슬라이더 값 그대로 ProgressBar에 반영
    @Slot(int)
    def update_progress_bar(self, value):
        self.progress_bar.setValue(value)

    # [4] 처리된 값(×2)을 LCD에 표시
    @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())

-  Qt 에서 구현 과제입니다.