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
인스턴스를 생성합니다.