• 티스토리 홈
  • 프로필사진
    소쩍소쩍이
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
소쩍소쩍이
  • 프로필사진
    소쩍소쩍이
    • 분류 전체보기 (51)
      • 파이썬 (18)
        • 문제 및 예제 (8)
      • PySide6 (15)
        • Signal & Slot (6)
        • Layout (8)
        • Model & View (1)
      • 리눅스 (5)
      • 아두이노 (0)
      • 일지 (11)
  • GitHub
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • 단일 시그널 / 다중 슬롯
      2026년 05월 26일
      • 소쩍소쩍이
      • 작성자
      • 2026.05.26.:20

      Qt의 Signal / Slot 구조에서는 하나의 Signal에 여러 Slot을 연결할 수 있다.

      하나의 이벤트가 발생했을 때 여러 함수가 동시에 실행되도록 구성할 수 있으며, 각 Slot은 서로 다른 화면 요소를 갱신할 수 있다.

      이번 예제에서는 슬라이더 값을 이용해 Label, ProgressBar, LCDNumber를 동시에 변경한다.


      사용되는 Signal

      QSlider.valueChanged(int)
      슬라이더 값이 변경될 때 발생하는 기본 Signal

      processedValueSignal
      슬라이더 값을 가공한 뒤 전달하기 위해 만든 사용자 정의 Signal

       

      연결되는 Slot

      respond_to_slider(value)
      원본 값을 Label에 표시하고 처리된 값을 emit()

      update_progress_bar(value)
      원본 값을 ProgressBar에 반영

      handle_processed_value(value)
      가공된 값을 Label에 표시

      update_lcd(value)
      가공된 값을 LCDNumber에 표시

      즉 슬라이더를 움직이면 여러 Slot 함수가 동시에 실행되면서 여러 위젯이 함께 갱신된다.


      예제 코드

      import sys
      
      from PySide6.QtCore import Qt, Signal, Slot
      from PySide6.QtWidgets import (
          QApplication,
          QWidget,
          QSlider,
          QVBoxLayout,
          QLabel,
          QProgressBar,
          QLCDNumber
      )
      
      
      class SliderExample(QWidget):
      
          processedValueSignal = Signal(int)
      
          def __init__(self):
              super().__init__()
      
              self.setWindowTitle("단일 Signal / 다중 Slot 예제")
              self.resize(300, 220)
      
              self.label_original = QLabel("원본 값: -")
              self.label_processed = QLabel("처리된 값(×2): -")
      
              self.slider = QSlider(Qt.Horizontal)
              self.slider.setRange(1, 100)
              self.slider.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)
      
              # 하나의 Signal에 여러 Slot 연결
              self.slider.valueChanged.connect(self.respond_to_slider)
              self.slider.valueChanged.connect(self.update_progress_bar)
      
              # 사용자 정의 Signal에 여러 Slot 연결
              self.processedValueSignal.connect(self.handle_processed_value)
              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)
      
          @Slot(int)
          def respond_to_slider(self, value):
      
              self.label_original.setText(
                  f"원본 값: {value}"
              )
      
              processed_value = value * 2
      
              self.processedValueSignal.emit(
                  processed_value
              )
      
          @Slot(int)
          def handle_processed_value(self, 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())
      1. valueChanged(int)
      슬라이더 값이 변경될 때마다 현재 값을 전달하는 Signal

      2. 여러 Slot 연결
      하나의 Signal에 여러 Slot을 연결했기 때문에
      슬라이더를 움직이면 Label과 ProgressBar가 동시에 갱신됨

      3. 값 가공
      respond_to_slider()에서 전달받은 값을 2배로 처리

      4. emit() 실행
      processedValueSignal.emit()으로 처리된 값을 전달하면서
      사용자 정의 Signal 발생

      5. 여러 Slot 동시 실행
      emit()으로 전달된 값은
      handle_processed_value()와 update_lcd()로 동시에 전달됨

      6. 최종 결과
      하나의 Signal은 여러 Slot을 실행할 수 있으며
      각 Slot은 서로 다른 역할을 담당할 수 있음


      동작 흐름

      1. 사용자가 슬라이더 이동
      ↓
      2. valueChanged(int) Signal 발생
      ↓
      3. respond_to_slider(value) 실행
      ↓
      4. value * 2 처리
      ↓
      5. processedValueSignal.emit(processed_value) 실행
      ↓
      6. handle_processed_value(value) 실행
      ↓
      7. update_lcd(value) 실행
      ↓
      8. ProgressBar / QLabel / LCDNumber 갱신

       

      구성 요소 설명
      단일 Signal 하나의 이벤트 발생 신호
      다중 Slot 하나의 Signal에 여러 Slot 함수 연결 가능
      valueChanged(int) 슬라이더 값이 변경될 때 발생하는 기본 Signal
      processedValueSignal 처리된 값을 전달하기 위한 사용자 정의 Signal
      QProgressBar 원본 값을 진행률 형태로 표시
      QLCDNumber 처리된 값을 숫자 형태로 표시
      정리

      하나의 Signal은 여러 Slot에 연결할 수 있다.
      valueChanged(int)는 슬라이더의 현재 값을 전달한다.
      사용자 정의 Signal은 가공된 값을 다른 위젯이나 함수로 전달할 때 유용하다.
      emit()은 Signal을 실제로 발생시키는 메서드이다.

      'PySide6 > Signal & Slot' 카테고리의 다른 글

      다중 시그널 / 단일 슬롯  (0) 2026.05.26
      사용자 정의 시그널  (0) 2026.05.26
      QSlider 값 전달  (0) 2026.05.26
      Data(값) 전달  (0) 2026.05.26
      Signal & Slot 개념  (0) 2026.05.26
      다음글
      다음 글이 없습니다.
      이전글
      이전 글이 없습니다.
      댓글
    조회된 결과가 없습니다.
    스킨 업데이트 안내
    현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
    ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바