본문으로 건너뛰기

PySide2 Signal and Slot

Signal and Slot

시그널과 슬롯을 사용하면 객체간 통신을 할 수 있습니다.

  • 하나의 시그널을 여러 슬롯에 연결할 수 있습니다.
  • 시그널은 다른 시그널에 연결할 수 있습니다.
  • 시그널은 QObject의 파생 클래스에 클래스 변수에 할당해야 합니다.
  • 하나의 슬롯을 여러 시그널에 연결할 수 있습니다.
  • @Slot 데코레이터를 사용하지 않아도 슬롯으로 쓸 수 있습니다.
  • 쓰레드 사이의 통신을 위해 시그널과 슬롯을 사용할 수 있습니다.
정보

A 시그널에 a 슬롯을 여러번 연결하면, 시그널이 발생했을 때 연결된 횟수 만큼 슬롯을 호출합니다.

Examples

import sys

from PySide2.QtWidgets import QMainWindow, QApplication
from PySide2.QtCore import Signal, Slot

from ui_mainwindow import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
"""
Ui 클래스 상속 및
사용자 정의 시그널 생성
"""

# clickedSignal = Signal((int,), (str,))
pushButtonClickedSignal = Signal(int)
pushButton2ClickedSignal = Signal(str)

def __init__(self):
super().__init__()
"""
Ui 설정
"""
self.setupUi(self)
self.pushButton.setText("버튼 1")
self.pushButton2.setText("버튼 2")

"""
버튼 클릭 시그널에 슬롯 추가
"""
self.pushButton.clicked.connect(self.pushButtonClicked)
self.pushButton2.clicked.connect(self.pushButton2Clicked)

"""
사용자 정의 시그널에 슬롯 추가
"""
# self.clickedSignal[int].connect(self.appendTextBrowser)
# self.clickedSignal[str].connect(self.appendTextBrowser)
self.pushButtonClickedSignal.connect(self.appendTextBrowser)
self.pushButton2ClickedSignal.connect(self.appendTextBrowser)

self.count = 0

def pushButtonClicked(self):
"""
Slot 데코레이터가 없으면 매개변수가 없는 슬롯으로 볼 수 있음
"""
self.count += 1
"""
pushButtonClickedSignal 출력
Signal.emit(정의된 변수)
"""
# self.clickedSignal[int].emit(self.count)
self.pushButtonClickedSignal.emit(self.count)

def pushButton2Clicked(self):
self.count = 0
# self.clickedSignal[str].emit("init count")
self.pushButton2ClickedSignal.emit("init count")

@Slot(int)
@Slot(str)
def appendTextBrowser(self, var):
"""
int 또는 str을 매개변수로 받을 수 있는 슬롯 생성
"""
if isinstance(var, int):
self.textBrowser.append("count : " + str(var))
else:
self.textBrowser.append(var)


if __name__ == "__main__":
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
import sys

from PySide2.QtWidgets import QMainWindow, QApplication
from PySide2.QtCore import Signal, Slot

from ui_mainwindow import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
"""
2 개의 매개변수를 갖는 시그널 생성
"""

clickedSignal = Signal((int, int), (str, int))

def __init__(self):
super().__init__()

self.setupUi(self)
self.pushButton.setText("버튼 1")
self.pushButton2.setText("버튼 2")

self.pushButton.clicked.connect(self.pushButtonClicked)
self.pushButton2.clicked.connect(self.pushButton2Clicked)

self.clickedSignal[int, int].connect(self.appendTextBrowser)
self.clickedSignal[str, int].connect(self.appendTextBrowser)

self.count1 = 0
self.count2 = 0

def pushButtonClicked(self):
self.count1 += 1
self.count2 += 1
self.clickedSignal[int, int].emit(self.count1, self.count2)

def pushButton2Clicked(self):
self.count1 = 0
self.clickedSignal[str, int].emit("set count1", self.count1)

@Slot(int, int)
@Slot(str, int)
def appendTextBrowser(self, var1, var2):
if isinstance(var1, int):
self.textBrowser.append("count1: {}, count2: {}".format(var1, var2))
else:
self.textBrowser.append("{} to {}".format(var1, var2))


if __name__ == "__main__":
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())

Reference