1. 코드
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, \ QPushButton, QLabel, QMainWindow from PyQt5.QtCore import Qt, pyqtSignal, QObject import sys class Signal(QObject): closeProgram = pyqtSignal() addText = pyqtSignal() class 사용자정의시그널(QMainWindow): def __init__(self): super().__init__() self.UI초기화() def UI초기화(self): self.signal1 = Signal() self.signal1.closeProgram.connect(self.close) ''' 앞에서 사용했던 예제 btn = QPushButton('클릭') btn.clicked.connect(self.changeLabel) #changeLabel은 슬롯(slot) ''' self.label1 = QLabel('시그널을 알아볼까요?', self) self.label1.setFixedSize(300, 20) self.label1.move(40, 100) self.signal2 = Signal() self.signal2.addText.connect(self.changelabel) self.setGeometry(300, 300, 400, 200) self.setWindowTitle('Emit Signal') self.show() def mouseDoubleClickEvent(self, event): self.signal1.closeProgram.emit() def mousePressEvent(self, event): self.signal2.addText.emit() def changelabel(self): self.label1.setText('마우스가 눌렸습니다!') def close(self): super().close() 프로그램무한반복 = QApplication(sys.argv) 실행인스턴스 = 사용자정의시그널() 프로그램무한반복.exec_()
2. 상세 내용
from PyQt5.QtCore import Qt,pyqtSignal, QObject
- 새로운 시그널을 만들기 위해 pyqtSignal을, 모든 위젯의 상위에 있는 QObject를 추가
class Signal(QObject): closeProgram = pyqtSignal() addText = pyqtSignal()
- 여러 시그널을 담기 위해 따로 클래스로 정의
- 각 시그널을 pyqtSignal() 정의
self.signal1 = Signal() self.signal1.closeProgram.connect(self.close)
- 클래스를 활용해 signal1이라는 인스턴스를 만듭니다.
- 그 객체 안에 closeProgram이라는 시그널을 호출합니다. 그런데 어떤 동작을 하면 시그널을 호출할까요?
def mouseDoubleClickEvent(self, event): self.signal1.closeProgram.emit()
- 마우스를 더블클릭하면 closeProgram시그널을 emit()를 통해 동작하게 합니다. 결국
self.close
로 프로그램을 종료하게 됩니다.
self.signal2 = Signal() self.signal2.addText.connect(self.changelabel)
Signal()
을 통해 새로운signal2
인스턴스를 생성합니다.
def mousePressEvent(self, event): self.signal2.addText.emit()
- 마우스가 눌렸다면
addText
라는 시그널을 발생(emit()
)합니다. 이는changelabel
슬롯을 호출하게 되죠.
def changelabel(self): self.label1.setText("마우스가 눌렸어요!")
- 해당 함수에서는 라벨을 변경합니다.
즉 시그널을 만들고(pyqtSignal) 그 시그널을 발생(emit)시키는 어떤 동작함수를 만들어 연결시킨(connect) 슬롯의 동작을 수행하도록 합니다.
3. 실행 화면

