본문 바로가기
  • You find inspiration to create your own path !
업무 자동화/python & CAD

Qt Designer 학습] 시그널 이란?

by ToolBOX01 2025. 9. 10.
반응형

Qt Designer에서 시그널(Signal)은 Qt 프레임워크의 핵심 개념 중 하나로, 특정 이벤트나 상태 변화가 발생했을 때 객체가 보내는 "알림" 또는 "메시지"를 의미합니다. 시그널은 사용자 인터페이스(UI)에서 사용자 상호작용(예: 버튼 클릭, 텍스트 입력 등)이나 객체의 상태 변화(예: 타이머 만료, 데이터 수신 등)를 감지하고, 이를 다른 객체(또는 함수)로 전달하여 특정 동작을 수행하도록 연결하는 역할을 합니다.

 


▣ 시그널(Signal) & 슬롯(Slot)

Qt Designer에서 시그널(Signal)과 슬롯(Slot)은 Qt 프레임워크의 핵심 메커니즘인 시그널-슬롯 메커니즘을 통해 이벤트를 처리하고 UI 구성 요소 간의 상호작용을 관리하는 데 사용됩니다.

1. 시그널과 슬롯의 기본 개념

  • 시그널(Signal):
    특정 이벤트가 발생했을 때 객체가 방출하는 신호입니다.
    예를 들어, 버튼이 클릭되면 clicked() 시그널이 발생합니다.
  • 슬롯(Slot): 
    시그널이 발생했을 때 호출되는 함수(또는 메서드)입니다. 
    슬롯은 시그널에 대한 응답으로 실행되는 동작을 정의합니다.
  • 관계:
    시그널과 슬롯은 연결(connect)을 통해 짝지어집니다.
    특정 시그널이 발생하면 연결된 슬롯이 자동으로 호출되어 작업을 수행합니다.

2. Qt Designer에서의 시그널과 슬롯

Qt Designer는 UI를 시각적으로 설계하는 도구로, 시그널과 슬롯을 연결하는 기능을 제공합니다. 이 연결은 .ui 파일에 저장되며, 파이썬 코드(PyQt 또는 PySide)에서 이를 로드하여 동작을 구현합니다.
Qt Designer에서 시그널-슬롯 연결 방법은 아래와 같습니다

1.시그널-슬롯 편집기 사용:

  • Qt Designer의 "Signal/Slot Editor"를 사용하여 위젯의 시그널(예: QPushButton의 clicked())과 슬롯(예: 사용자 정의 함수 또는 다른 위젯의 메서드)을 연결합니다.
  • 예: 버튼의 clicked() 시그널을 특정 슬롯(예: onButtonClicked)에 연결.

2. 자동 연결(Auto-Connection):

  • Qt Designer에서는 슬롯 이름을 특정 규칙(예: on_객체명_시그널명)에 따라 정의하면 자동으로 연결됩니다.
  • 예: on_pushButton_clicked라는 메서드는 pushButton의 clicked() 시그널에 자동 연결됩니다.

3. 파이썬 코드에서 수동 연결:

  • Qt Designer에서 .ui 파일을 로드한 후, 파이썬 코드에서 connect() 메서드를 사용해 시그널과 슬롯을 수동으로 연결할 수 있습니다.

3. 시그널과 슬롯의 관계 특징

1) 1:1, 1:N, N:1 연결 가능:

  • 하나의 시그널이 여러 슬롯에 연결될 수 있습니다(1:N).
  • 여러 시그널이 하나의 슬롯에 연결될 수도 있습니다(N:1).
  • 예: 버튼의 clicked() 시그널이 여러 슬롯(함수)을 호출하거나, 여러 버튼의 시그널이 하나의 슬롯에 연결될 수 있음.

2) 비동기적 동작:

  • 시그널이 발생하면 연결된 슬롯이 즉시 또는 큐에 따라 호출됩니다.

3) 유연한 인자 전달:

  • 시그널은 데이터를 포함할 수 있으며(예: valueChanged(int)), 슬롯은 이 데이터를 받아 처리할 수 있습니다.
    단, 슬롯의 인자는 시그널의 인자와 호환되어야 합니다.

3) 객체 간 독립성:

  • 시그널과 슬롯은 객체 간의 느슨한 결합(loose coupling)을 유지합니다. 즉, 시그널을 방출하는 객체는 어떤 슬롯이 호출되는지 알 필요가 없습니다.

▣ 예제: Qt Designer와 파이썬 코드에서의 시그널-슬롯

pushButtonOk 버튼을 클릭하면 LabelInfo 라벨에 "안녕하세요"라는 문구가 표시됩니다. 이 코드는 Qt Designer와 PyQt6를 사용하여 간단한 GUI 상호작용을 구현한 예제입니다

my_ui.ui 파일 다운로드

my_ui.ui
0.00MB

파이썬 코드 예시

from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.uic import loadUi
import sys

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # Qt Designer에서 생성한 my_ui.ui 파일 로드
        loadUi("my_ui.ui", self)
        # pushButtonOk의 clicked 시그널을 슬롯에 연결
        self.pushButtonOk.clicked.connect(self.on_button_ok_clicked)

    def on_button_ok_clicked(self):
        # LabelInfo 라벨에 "안녕하세요" 텍스트 설정
        self.LabelInfo.setText("안녕하세요")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec())

 

1. 모듈 임포트 : 자주 사용하는 코드 이며, Template 코드로 활용 가능

from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.uic import loadUi
import sys

 

1) PyQt6.QtWidgets에서 QApplicationQMainWindow를 가져옵니다.

  • QApplication: Qt 애플리케이션 전체를 관리하는 클래스입니다. 모든 Qt GUI 프로그램은 이 클래스의 인스턴스를 필요로 합니다.
  • QMainWindow: 메인 창을 생성하는 클래스입니다. Qt Designer로 만든 UI를 이 창에 로드합니다.

2) PyQt6.uic에서 loadUi를 가져옵니다. 이는 Qt Designer의 .ui 파일을 파이썬 코드에서 로드하는 데 사용됩니다.

3) sys 모듈은 프로그램 종료 시 시스템 상태를 관리하기 위해 사용됩니다.

2. 클래스 정의

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

 

  • MyWindow 클래스를 정의하며, QMainWindow를 상속받습니다. 이는 메인 창을 나타내는 클래스입니다.
  • __init__ 메서드는 클래스의 초기화 메서드입니다.
  • super().__init__()은 부모 클래스(QMainWindow)의 초기화 메서드를 호출하여 기본 설정을 수행합니다.

3. .ui 파일 로드

loadUi("my_ui.ui", self)
  • loadUi("my_ui.ui", self)는 Qt Designer에서 만든 my_ui.ui 파일을 로드하여 현재 창(self)에 UI를 적용합니다.
  • .ui 파일에는 pushButtonOk(버튼)와 LabelInfo(라벨)와 같은 위젯의 정보가 포함되어 있습니다.
  • 이 명령은 .ui 파일에 정의된 모든 위젯을 self 객체의 속성으로 자동으로 추가합니다(예: self.pushButtonOk, self.LabelInfo).

4. 시그널-슬롯 연결

self.pushButtonOk.clicked.connect(self.on_button_ok_clicked)
  • self.pushButtonOk는 .ui 파일에서 정의된 버튼 위젯입니다.
  • clicked는 버튼이 클릭될 때 발생하는 시그널입니다.
  • .connect(self.on_button_ok_clicked)는 clicked 시그널이 발생했을 때 호출할 슬롯(함수)으로 on_button_ok_clicked 메서드를 지정합니다.
  • 즉, 사용자가 pushButtonOk 버튼을 클릭하면 on_button_ok_clicked 메서드가 실행됩니다.

5. 슬롯 구현

    def on_button_ok_clicked(self):
        self.LabelInfo.setText("안녕하세요")
  • on_button_ok_clicked는 버튼 클릭 시 호출되는 슬롯 메서드입니다.
  • self.LabelInfo.ui 파일에서 정의된 라벨 위젯입니다.
  • setText("안녕하세요")LabelInfo 라벨의 텍스트를 "안녕하세요"로 설정합니다.
  • 결과적으로, 버튼을 클릭하면 라벨에 "안녕하세요"라는 문구가 표시됩니다.

6. 애플리케이션 실행

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec())
  • if __name__ == "__main__":는 이 파이썬 파일이 직접 실행될 때만 아래 코드를 실행하도록 합니다.
  • app = QApplication(sys.argv): Qt 애플리케이션 객체를 생성합니다. sys.argv는 명령줄 인자를 전달하여 애플리케이션 설정을 초기화합니다.
  • window = MyWindow(): MyWindow 클래스의 인스턴스를 생성하여 메인 창을 만듭니다.
  • window.show(): 창을 화면에 표시합니다.
  • sys.exit(app.exec()): 애플리케이션의 이벤트 루프를 시작하여 사용자 입력(예: 버튼 클릭)을 처리하고, 프로그램이 종료될 때 시스템 상태를 반환합니다.

 

Qt Designer로 위젯 배치만 하고, AI를 이용하여 파이썬 코드를 만들수 있습니다. 시그널과 슬롯의 개념을 이해 하십시요

by korealionkk@gmail.com


반응형