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 에서 구현

: 과제입니다.